【算法】重建二叉树

【算法】重建二叉树

https://www.nowcoder.com/practice/8a19cbe657394eeaac2f6ea9b0f6fcf6?tpId=13&tqId=11157&rp=1&ru=%2Fta%2Fcoding-interviews&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking&tab=answerKey


1.题目


2.推荐解法

  • 代码

    /**
     * Definition for binary tree
     * public class TreeNode {
     * int val;
     * TreeNode left;
     * TreeNode right;
     * TreeNode(int x) { val = x; }
     * }
     */
    
    public class Solution {
        public TreeNode reConstructBinaryTree(int[] pre, int[] in) {
            return reConstruct(pre, 0, pre.length - 1, in, 0, in.length - 1);
        }
    
        public TreeNode reConstruct(int[] pre, int preBegin, int preEnd, int[] in, int inBegin, int inEnd) {
            if (preBegin > preEnd || inBegin > inEnd)
                return null;
            TreeNode root = new TreeNode(pre[preBegin]);
            //找到当前根节点的左子树和右子树的划分位置
            int k = inBegin;
            while (pre[preBegin] != in[k]) k++;
    
            //在pre[]中:preBegin+1到preBegin+k-inBegin是左子树的下标
            //preEnd-inEnd+k+1到preEnd是右子树的下标
            root.left = reConstruct(pre, preBegin + 1, preBegin + k - inBegin, in, inBegin, k - 1);
            root.right = reConstruct(pre, preEnd - inEnd + k + 1, preEnd, in, k + 1, inEnd);
            return root;
        }
    }
    
  • 我自己写的时候没有考虑到要设置preEnd,导致pre[]数组下标越界。

    以及构件左子树时传值preBegin+1,因为pre[]中的节点要依次作为根节点。

posted @ 2021-03-31 11:41  musecho  阅读(43)  评论(0编辑  收藏  举报