重建二叉树

核心思路:

  • 因为二叉树的前序的第一个树必为父结点,而中序中则以该节点为界,左边的则为其左节点,右边的则为其右节点。
  • 通过递归重复完成上诉过程就行

代码:

 public TreeNode reConstructBinaryTree(int[] pre, int[] in) {

        //先判断pre或in数组是否为空,或者其长度为0,如果是,说明条件不符合或就是空树,直接返回空
        if (pre == null || in == null || pre.length <= 0 || in.length <= 0) {
            return null;
        }
        //如果只有一个节点,也不用往下走,直接返回
        if (in.length == 1) {
            return new TreeNode(in[0]);
        }

        int c = pre[0];

        //寻找父节点
        int mid = 0;
        for (; mid < pre.length; mid++) {
            if (c == in[mid]) {
                break;
            }
        }
        //如果遍历了数组还是没有父节点就返回空
        if (mid == pre.length) {
            return null;
        }

        //构建树
        TreeNode root = new TreeNode(c);                       //根节点

        //结点左边的子树
        int[] midLeft = Arrays.copyOf(in, mid);               //左子树中序
        int[] preLeft = new int[midLeft.length];              //左子树前序
        System.arraycopy(pre, 1, preLeft, 0, preLeft.length);

        int[] midRight = new int[pre.length - mid-1];          //右子树中序
        int[] preRight = new int[midRight.length];             //右子树前序
        System.arraycopy(in, mid+1, midRight, 0, midRight.length);
        System.arraycopy(pre, mid+1, preRight, 0, preRight.length);


        //递归遍历,获取树的左节点和右结点
        root.left = reConstructBinaryTree(preLeft, midLeft);
        root.right = reConstructBinaryTree(preRight, midRight);

        //返回根节点
        return root;

    }
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务