题目
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
分析
思路一:
- 前序遍历:从根结点开始遍历,然后优先遍历左子树,遵循深度优先,之后再遍历右子树。
- 中序遍历:有左子树则从左子树开始遍历,然后根结点,最后是右子树。
现给出了前序遍历序列和中序遍历序列。我们能得出什么结论? - 前序遍历序列:第一个结点为根结点。
- 中序遍历序列:根据1得出的根结点,找到在中序遍历序列中根结点所在的位置,而在其左边的结点全部为左子树,而在其右边的为右子树。
代码采用递归实现:
首先重新创建一个结点并将根节点的值传给他,命名为root。
递归头(递归结束的标志):子树的长度为0,则返回空结点,即上一结点的左右叶子结点为null。
递归体(执行递归的条件):程序最外层为一循环,其作用是遍历 中序遍历序列,寻找在中序序列中根结点的位置,如果找到了位置索引,就执行递归。
递归内容:root结点的左右叶子结点分别都调用自身函数,其中左子树调用自身函数时参数传入变为前序序列和中序序列的左子树部分,相应的右子树同理。
时间复杂度:o(N)
空间复杂度:o(N)
代码:
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
import java.util.Arrays;
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
if(pre.length==0||in.length==0) return null;
TreeNode root = new TreeNode(pre[0]);
for(int i=0;i<in.length;i++){
if(in[i]==root.val) {
root.left = reConstructBinaryTree(Arrays.copyOfRange(pre,1,i+1),
Arrays.copyOfRange(in,0,i));
root.right = reConstructBinaryTree(Arrays.copyOfRange(pre,i+1,pre.length),
Arrays.copyOfRange(in,i+1,in.length));
}
}
return root;
}
}