根据先序遍历和中序遍历构造二叉树

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

【思路】
根据中序和先序结果 重建二叉树
1.前序结果第一个非空节点为root节点,然后在中序结果中找个根节点,则左侧为左子序列,右侧为右子序列
2.根据左子序列长度,去前序结果中找出前序左子序列和右子序列
3.递归上述步骤,直至空子序列结束
根据中序和后序结果重建二叉树与上述类似

【根据中序和先序结果重建】

 /**
     * 根据中序和先序结果 重建二叉树
     * 1.前序结果第一个非空节点为root节点,然后在中序结果中找个根节点,则左侧为左子序列,右侧为右子序列
     * 2.根据左子序列长度,去前序结果中找出前序左子序列和右子序列
     * 3.递归上述步骤,直至空子序列结束
     *
     * @param pre
     * @param startPre
     * @param endPre
     * @param in
     * @param startIn
     * @param endIn
     * @return
     */
    public static TreeNode reconstruct1(int[] pre, int startPre, int endPre, int[] in, int startIn, int endIn) {
        if (startPre > endPre || startIn > endIn) {
            return null;
        }
        //重建根结点
        TreeNode root = new TreeNode(pre[startPre]);
        //根据root.val 在中序序列中确定根结点的位置下标i;
        for (int i = startIn; i < in.length; i++) {
            if (in[i] == root.val) {
                //左子树序列:i - startIn为左子树序列元素个数,左子序列在pre中索引位置为【startPre + 1, startPre + i - startIn】
                root.left = reconstruct1(pre, startPre + 1, startPre + i - startIn, in, startIn, i - 1);
                //右子树序列:右子序列在pre中索引位置为【startPre + i - startIn + 1, endPre】
                root.right = reconstruct1(pre, startPre + i - startIn + 1, endPre, in, i + 1, endIn);
            }
        }
        return root;
    }

【根据中序和后序结果重建】

/**
     * 根据中序和后序结果 重建二叉树
     * 1.后序结果最后一个非空节点为root节点,然后在中序结果中找到根节点,则左侧为左子序列,右侧为右子序列
     * 2.根据左子序列长度,去前序结果中找出前序左子序列和右子序列
     * 3.递归上述步骤,直至空子序列结束
     *
     * @param post
     * @param startPost
     * @param endPost
     * @param in
     * @param startIn
     * @param endIn
     * @return
     */
    public static TreeNode reconstruct2(int[] post, int startPost, int endPost, int[] in, int startIn, int endIn) {
        if (startPost > endPost || startIn > endIn) {
            return null;
        }
        //重建根结点
        TreeNode root = new TreeNode(post[startPost]);
        //根据root.val 在中序序列中确定根结点的位置下标i;
        for (int i = startIn; i < in.length; i++) {
            if (in[i] == root.val) {
                //左子树序列:i - startIn为左子树序列元素个数,左子序列在pre中索引位置为【startPost, startPost + i - startIn -1】
                root.left = reconstruct2(post, startPost, startPost + i - startIn - 1, in, startIn, i - 1);
                //右子树序列:右子序列在pre中索引位置为【startPost + i - startIn, endPost -1 】
                root.right = reconstruct2(post, startPost + i - startIn, endPost - 1, in, i + 1, endIn);
            }
        }
        return root;
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容