题目描述

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

思路分析

    这种题型是比较经典的二叉树问题了。做这种题之前一定要熟悉前序遍历,中序遍历,然后还要理解递归思想并且具备把递归思想转化成代码的能力。前序遍历有一个性质,就是遍历结果的第一个元素是根结点,而中序遍历也有一个性质,就是遍历结果中根结点所在位置的左边全是根结点左子树的元素,右边全是根结点右子树的元素。这两个性质可以结合起来利用。题目中给了前序遍历序列{1,2,4,7,3,5,6,8},我们由前序遍历的性质可知第一个元素1就是该二叉树的根结点,又结合中序遍历的性质可知在中序遍历序列{4,7,2,1,5,3,8,6}中元素1左边的4,7,2全是根结点左边的元素,5,3,8,6全是根结点右边的元素。现在我们可以得到二叉树的基础机构如下:
图片描述
目前只知道4,7,2这三个元素在根节点1的左边,5,3,8,6这四个元素在根节点1的右边。
由于二叉树的每个子树也都具备上述的性质,接下来,继续把4,7,2当做一个独立的二叉树L1,重复上面的步骤:先找4,7,2中谁是L1的“
根节点”,从前序遍历序列中可知4,7,2这三个元素最先遍历的是2,因此2是L1的“根结点“”,再结合L1的中序遍历序列{4,7,2}可知4,7这两个元素都在2的左边。
同理分析5,3,8,6这几个元素,把这几个元素当成一个独立二叉树R1。由前序遍历序列可知3是R1的根结点,再结合中序遍历序列可知,元素5在3的左边,元素8,6在3的右边。现在我们可以得到更清晰的二叉树结构:
图片描述
对于尚不清晰的子二叉树结构,重复上面步骤即可。

代码

public class Solution {
    public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
       if(pre.length == 0||in.length == 0){
            return null;
        }
        TreeNode node = new TreeNode(pre[0]);
        for(int i = 0; i < in.length; i++){
            if(pre[0] == in[i]){//找到中序遍历序列中,根结点所在位置,以便分割出左子树和右子树做递归操作
                node.left = reConstructBinaryTree(Arrays.copyOfRange(pre, 1, i+1), Arrays.copyOfRange(in, 0, i));
                node.right = reConstructBinaryTree(Arrays.copyOfRange(pre, i+1, pre.length), Arrays.copyOfRange(in, i+1,in.length));    ·
            }
        }
        return node;
    }
}

Summer
16 声望3 粉丝

引用和评论

0 条评论