重建二叉树

重建二叉树

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

使用库函数

class Solution {
    /**
    通过前序遍历中的第一个找到根结点,然后根据中序遍历结果根节点的左边为左子树,右边为右子树,
    然后两颗子树采用同样的方法找去到根节点
    **/
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        if(preorder.length == 0 || inorder.length == 0)
            return null;

        TreeNode node = new TreeNode(preorder[0]);

        for(int i = 0; i < inorder.length; i++){
            if(preorder[0] == inorder[i]){
                node.left = buildTree(Arrays.copyOfRange(preorder,1,i+1),Arrays.copyOfRange(inorder,0,i));
                node.right = buildTree(Arrays.copyOfRange(preorder,i+1,preorder.length),Arrays.copyOfRange(inorder,i+1,inorder.length));
                break;
            }
        }
        return node;
    }
}

使用ArrayList

class Solution {
    public TreeNode buildTree(int[] preorder, int[] inorder) {
    //把前序遍历的值和中序遍历的值放到list中
        List<Integer> preorderList = new ArrayList<>();
        List<Integer> inorderList = new ArrayList<>();
        for (int i = 0; i < preorder.length; i++) {
            preorderList.add(preorder[i]);
            inorderList.add(inorder[i]);
        }
        return builder(preorderList, inorderList);
    }

    private TreeNode builder(List<Integer> preorderList, List<Integer> inorderList) {
        if (inorderList.isEmpty())
            return null;
        //前序遍历的第一个值就是根节点
        int rootVal = preorderList.remove(0);

        //创建根结点
        TreeNode root = new TreeNode(rootVal);

        // 递归构建左右子树
        // 先找到根节点在中序遍历中的位置,进行划分
        int rootindex = inorderList.indexOf(rootVal);

        // 构建左子树,范围 [0:rootindex)
        root.left = builder(preorderList, inorderList.subList(0, rootindex));

        // 构建右子树,范围 (rootindex:最后的位置]
        root.right = builder(preorderList, inorderList.subList(rootindex + 1, inorderList.size()));
        // 返回根节点  
        return root;
    }
}
剑指offer 文章被收录于专栏

为刷过的每一道题都书写一篇题解,便于重复练习~

全部评论

相关推荐

预计下个星期就能开奖吧,哪位老哥来给个准信
华孝子爱信等:对接人上周说的是这周
点赞 评论 收藏
分享
专心打鱼:互联网搬运工,贴子都要偷
点赞 评论 收藏
分享
伟大的烤冷面被普调:暨大✌🏻就是强
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务