给定二叉树前序和中序序列重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
思路:前序序列第一个肯定为root,设值为N,则在中序序列中N所在位置左边的肯定是左子树的元素,右边的是右子树的元素,因此,递归找root即可
public class Solution { public TreeNode reConstructBinaryTree(int [] pre,int [] in) { return reConstructBinaryTree0(pre, 0, pre.length, in, 0, in.length); } public TreeNode reConstructBinaryTree0(int [] pre, int preStart, int preEnd, int [] in, int inStart, int inEnd) { if (preStart >= preEnd) { // way out return null; } int rootIndex = indexOf(in, inStart, inEnd, pre[preStart]); TreeNode root = new TreeNode(pre[preStart]); int leftPreStart = preStart + 1; int leftPreEnd = leftPreStart + (rootIndex - inStart); int leftInStart = inStart; int leftInEnd = rootIndex; // 构建左子树 root.left = reConstructBinaryTree0(pre, leftPreStart, leftPreEnd, in, leftInStart, leftInEnd); int rightPreStart = leftPreEnd; int rightPreEnd = preEnd; int rightInStart = rootIndex + 1; int rightInEnd = inEnd; // 构建右子树 root.right = reConstructBinaryTree0(pre, rightPreStart, rightPreEnd, in, rightInStart, rightInEnd); return root; } // 找下标 public int indexOf(int[] array, int start, int end, int value) { for (int i = start; i < end; i++) { if (array[i] == value) { return i; } } return -1; } }
相关推荐
给定二叉树的前序和中序序列,设计算法输出它的后序序列。 算法设计: 给定二叉树的前序和中序序列,输出它的后序序列。 数据输入: 由文件input.txt 提供输入数据。第1行是二叉树的前序序列,第2行是中序序列(序列...
重建二叉树的方法不仅限于这两种情况,还可以通过其他序列组合来重建,但前序和中序或后序和中序是最常见的两种方式。理解这些基本的遍历序列和它们与二叉树结构的关系是解决此类问题的关键。熟练掌握这些方法有助于...
在给定的描述中,提到可以通过前序和中序序列恢复二叉树。这是因为二叉树的前序和中序序列足以唯一确定一棵树。具体方法是利用中序序列找到根节点,然后通过前序序列划分左子树和右子树,递归地进行同样的操作,直到...
这里我们将重点讨论如何在已知二叉树的前序和中序遍历的情况下,通过非递归算法实现后序遍历。 **前序遍历**:根节点 -> 左子树 -> 右子树 **中序遍历**:左子树 -> 根节点 -> 右子树 **后序遍历**:左子树 -> 右子...
给定一个二叉树的前序和中序遍历结果,可以唯一确定该树的结构。前序遍历中的第一个元素是树的根节点,而在中序遍历中,根节点将左右子树分隔开。通过找到这个分隔点,我们可以确定左子树和右子树的中序序列,然后对...
**前序序列和中序序列构建二叉树**:给定一个二叉树的前序和中序遍历序列,可以唯一确定该二叉树。前序遍历的第一个元素是树的根,中序遍历中根节点左边的元素是左子树的中序遍历,右边的是右子树的中序遍历。通过...
本节将详细介绍二叉树的前序、中序和后序遍历,以及如何求解二叉树的深度和叶节点数量。 **前序遍历(Preorder Traversal)** 前序遍历的顺序是:根节点 -> 左子树 -> 右子树。在代码实现中,通常采用递归的方式...
本篇文章将详细介绍如何根据给定的先序遍历和中序遍历序列来重建原始的二叉树结构。 #### 二、解决问题的关键步骤 根据题目描述,我们需要编写一个程序,该程序能够接收两行输入,分别是先序遍历序列和中序遍历...
给定前序和中序遍历序列,我们可以构建出唯一的二叉树。这是因为前序遍历的第一个元素始终是树的根节点,而中序遍历将树分割为两部分:左子树的元素在根之前,右子树的元素在根之后。通过这种方式,我们可以找到根...
我们数据结构的实验,给定二叉树的中序序列和先序序列,以确定二叉树。我用VC++做了个简单的画图,可以看到树的样子。 我们数据结构课程已经结课了,我准备做出一个关于“图论”的一个演示系统GraphSystem,使书上...
`build_tree` 函数可以用来根据给定的前序和中序遍历序列构建二叉树。 5. **已知前序和中序,求后序遍历** 在已知前序和中序遍历的情况下,可以先通过前序遍历确定根节点,再根据中序遍历找到根节点在中序遍历序列...
根据前序和中序遍历序列,我们可以唯一地恢复一棵二叉树。下面我们将详细探讨这个过程。 首先,前序遍历的顺序是根节点 -> 左子树 -> 右子树,而中序遍历的顺序是左子树 -> 根节点 -> 右子树。这两个序列结合可以...
9. **主函数**:`main()`函数中,用户输入的数据被用来构建二叉树,然后调用前序、中序遍历函数打印树的前序和中序序列,同时计算并打印树的叶子节点数量和高度。 以上就是给定代码实现的二叉树相关知识点,包括...
题目描述的任务是根据给定的前序遍历和中序遍历序列来构造二叉树。这个问题的核心在于理解这两个遍历序列如何定义了树的结构。前序遍历的第一个元素总是树的根,而中序遍历可以将树分割为左子树和右子树两部分:中序...
二叉树的遍历主要有三种方式:前序遍历、中序遍历和后序遍历。 1. **前序遍历**: - 访问根节点; - 遍历左子树; - 遍历右子树。 这种遍历方式通常用于复制二叉树或构建一个新的与原二叉树结构相同的二叉树...
定义二叉树类,封装构造二叉树操作、遍历操作. 实现由先序、中序序列构造二叉树的算法 实现由后序、中序序列构造二叉树的算法
[问题描述] 建立二叉树,并输出二叉树的先序,中序和后序遍历序列,以及二叉树的叶子数。 [基本要求] 要求根据读取的元素建立二叉树,能输出各种遍历。 [实现提示] 可通过输入带空格的前序序列建立二叉链表。
题目要求根据给定的前序遍历序列和中序遍历序列来构建二叉树,并求出后序遍历序列。具体实现步骤如下: 1. **构建二叉树**:首先读取输入文件中的前序遍历序列和中序遍历序列,通过递归的方式构建二叉树。在前序...
总结,给定先序和中序遍历序列,可以通过递归算法构建对应的二叉树链式存储结构。这个过程涉及到对遍历序列的理解,以及如何利用这些信息来恢复二叉树的结构。这个算法是数据结构和算法领域中的基础问题,对于理解和...
要从给定的前序和中序遍历序列重建二叉树,首先需要理解这两个序列的关系。前序遍历的第一个元素是树的根节点,而在中序遍历中,这个根节点将整个序列分为两个部分:左边是左子树的中序遍历,右边是右子树的中序遍历...