美文网首页
重建二叉树

重建二叉树

作者: Hammy | 来源:发表于2018-01-31 17:43 被阅读0次

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

思路:
可以根据前序遍历序列来找到根节点,然后根据中序遍历找到对应根节点的位置.
来分割左子树和右子树.根据题目给出的序列,原型二叉树如下:


image.png

我们可以看出根左边2,4,7(4,7,2)是改树的左子树,3,5,6,8(5,3,8,6)是右子树.
整体下来就可以通过递归的思想去完成这道题,根据中序序列根结点的位置的左右序列来确定节点的左右子树.

    public TreeNode reConstructBinaryTree(int[] pre, int[] in)
    {
        if(pre == null || in == null || pre.length == 0 || in.length == 0)
            return null;

        return reConstructBinaryTree(pre,0,pre.length - 1,in,0,in.length - 1);
    }

    /**
     * 利用递归的思想完成重建
     * 1.根节点根据preOrder确定
     * 2.左右子树通过inOrder确定
     * 3.条件root.left(preStart+1)代表左子树的起点每次在当前位置的下一个
     *       preStart+length表示:length表示左子树的长度,preStart表示pre左子树的启示位置.
     *       preStart+leftLength代表左子树的结尾,那么下一个元素就是右子树的起点
     *       preStart+length+1就代表右子树的开始位置.
     * @param pre
     * @param preStart
     * @param preEnd
     * @param in
     * @param inStart
     * @param inEnd
     * @return
     */
    private TreeNode reConstructBinaryTree(int[] pre,int preStart,int preEnd,int[] in,int inStart,int inEnd){
        //递归终止条件
        if(preStart > preEnd || inStart > inEnd)
            return null;
        //定义根节点
        TreeNode root = new TreeNode(pre[preStart]);
        for(int i=inStart;i<=inEnd;i++){//说明找到了根节点
            if(in[i] == pre[preStart]){
                //确定左子树长度
                int leftLength = i - inStart;
                //然后分别确定左右子树
                root.left = reConstructBinaryTree(pre,preStart+1,preStart+leftLength,in,inStart,i-1);
                root.right = reConstructBinaryTree(pre,leftLength+1+preStart,preEnd,in,i+1,inEnd);
            }
        }
        return root;
    }
}

相关文章

  • LeetCode 每日一题 [42] 重建二叉树

    LeetCode 重建二叉树 [中等] 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历...

  • Java后端开发算法基础面试题分享,你离大厂也许就差这份面试题!

    一、算法基础 1. 重建二叉树 题目: 输入一棵二叉树前序遍历和中序遍历的结果,请重建该二叉树。 注意: 二叉树中...

  • 重建二叉树

    已知二叉树的前序和中序遍历序列,以此重建二叉树。 重建二叉树,必须知道前序和中序序列,其他组合都不行。 publi...

  • 剑指Offer(四)

    剑指Offer(四) 重建二叉树 题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的...

  • Java日记2018-06-19

    重建二叉树 矩阵中的路径

  • 一题一算法2018-02-06(重建二叉树)

    题目:重建二叉树 题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍...

  • 重建二叉树

    《剑指offer》面试题7:重建二叉树 题目:输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前...

  • 重建二叉树

    题目来源:牛客网--重建二叉树 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序...

  • java中如何实现重建二叉树

    java中如何实现重建二叉树 题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和...

  • 07:重建二叉树

    题目07:重建二叉树 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果...

网友评论

      本文标题:重建二叉树

      本文链接:https://www.haomeiwen.com/subject/brdlzxtx.html