美文网首页剑指offer最优解Java版
剑指offer最优解Java版-重建二叉树

剑指offer最优解Java版-重建二叉树

作者: 全菜工程师小辉 | 来源:发表于2019-06-22 12:32 被阅读2次

    题目描述

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

    补充知识

    前序、中序、后序遍历的特性:
    前序遍历:

    1. 访问根节点
    2. 遍历左子树
    3. 遍历右子树

    中序遍历:

    1. 遍历左子树
    2. 访问根节点
    3. 遍历右子树

    后序遍历:

    1. 后序遍历左子树
    2. 后序遍历右子树
    3. 访问根节点

    前中后序决定了根节点的访问顺序

    解决方法

    先在前序遍历中找到子树的根节点,然后再在中序遍历中找到对应这个节点,就可以划分出子树根节点对应的左右子树。

    class TreeNode {
        int      val;
        TreeNode left;
        TreeNode right;
    
        TreeNode(int x) {
            val = x;
        }
    }
    
    class Solution {
    
        public static TreeNode reConstructBinaryTree(int[] pre, int[] in) {
            TreeNode root = reConstructBinaryTree(pre, 0, pre.length - 1, in, 0, in.length - 1);
            return root;
        }
    
        // 前序遍历{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6}
        private static TreeNode reConstructBinaryTree(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]);
    
            for (int i = startIn; i <= endIn; i++)
                if (in[i] == pre[startPre]) {
                    root.left = reConstructBinaryTree(pre, startPre + 1, startPre + i - startIn, in, startIn, i - 1);
                    root.right = reConstructBinaryTree(pre, i - startIn + startPre + 1, endPre, in, i + 1, endIn);
                    break;
                }
    
            return root;
        }
    
        public static void main(String[] args) {
            preOrder(reConstructBinaryTree(new int[]{1, 2, 4, 7, 3, 5, 6, 8},
                    new int[]{4, 7, 2, 1, 5, 3, 8, 6}));
        }
    
        public static void preOrder(TreeNode treeNode) {
            if (treeNode == null) {
                return;
            }
            System.out.println(treeNode.val);
            if (treeNode.left != null) {
                preOrder(treeNode.left);
            }
            if (treeNode.right != null) {
                preOrder(treeNode.right);
            }
        }
    }
    

    复杂度分析:

    • 时间复杂度:O(nlogn)。
    • 空间复杂度:O(1)。
    哎呀,如果我的名片丢了。微信搜索“全菜工程师小辉”,依然可以找到我

    相关文章

      网友评论

        本文标题:剑指offer最优解Java版-重建二叉树

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