美文网首页
剑指offer_3_重建二叉树

剑指offer_3_重建二叉树

作者: 韩who | 来源:发表于2020-01-20 16:21 被阅读0次

    重建二叉树

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

    思路:

    /**
     * 根据前序序列第一个结点确定根结点
     * 根据根结点在中序序列中的位置分割出左右两个子序列
     * 对左子树和右子树分别递归使用同样的方法继续分解
     */
    

    解题:

     //树的结点  
    static class TreeNode {
            int val;
            TreeNode left;
            TreeNode right;
            TreeNode(int x) {
                val = x;
            }
        }
    
     //使用递归重建这棵树 
     //pre为前序遍历数组,in为中序遍历数组
    public static 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]){
                 root.left=reConstructBinaryTree(Arrays.copyOfRange(pre,1,i+1),Arrays.copyOfRange(in,0,i));
                    root.right=reConstructBinaryTree(Arrays.copyOfRange(pre,i+1,pre.length),Arrays.copyOfRange(in,i+1,in.length));
                   break;
                 }
             }
             return root;
    
        }
    

    说明:

    Arrays.copyOfRange(target,i,j)

    是截取目标数组,重第i个位到第j个位置

    包括上指针i,不包括 下指针j

    相关文章

      网友评论

          本文标题:剑指offer_3_重建二叉树

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