美文网首页剑指offer
06_重建二叉树

06_重建二叉树

作者: 是新来的啊强呀 | 来源:发表于2020-05-18 17:46 被阅读0次

    要求:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。
    假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
    例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
    思路:根据中序遍历和前序遍历可以确定二叉树,具体过程为:
    1、根据前序序列第一个结点确定根结点
    2、根据根结点在中序序列中的位置分割出左右两个子序列
    3、对左子树和右子树分别递归使用同样的方法继续分解

    class TreeNode{
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(int val){
            this.val = val;
        }
    }
     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] == pre[0]){
                    // 左子树,注意 copyOfRange 函数,左闭右开
                    // 或者直接调用Arrays.copyOfRange();
                    root.left = reConstructBinaryTree(copyOfRange(pre,1,i+1),copyOfRange(in,0,i));
                    // 右子树,注意 copyOfRange 函数,左闭右开
                    root.right = reConstructBinaryTree(copyOfRange(pre,i+1,pre.length),copyOfRange(in,i+1,pre.length));
                }
            }
            return root;
        }
        // 根据起始索引和终止索引复制数组内容,左闭右开
        public int[] copyOfRange(int[] arr,int indexOfstart,int indexOfend){
            if(indexOfend < indexOfstart){
                return null;
            }
            int[] temp = new int[indexOfend-indexOfstart];
            for(int i = indexOfstart; i < indexOfend;i++){
                temp[i-indexOfstart] = arr[i];
            }
            return temp;
        }
    

    相关文章

      网友评论

        本文标题:06_重建二叉树

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