LeetCode 105 从前序与中序遍历序列构造二叉树

LeetCode 105 从前序与中序遍历序列构造二叉树
问题描述:
根据一棵树的前序遍历与中序遍历构造二叉树。
注意:

  • 你可以假设树中没有重复的元素。

例如,给出

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]

返回如下的二叉树:

3
/ \
9 20
/ \
15 7
执行用时:4 ms, 在所有 Java 提交中击败了47.35%的用户
内存消耗:38.9 MB, 在所有 Java 提交中击败了93.03%的用户

递归:

class Solution {
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        return buildTree(inorder, postorder, new int[]{0, inorder.length-1}, new int[]{0, postorder.length-1});
    }
     
    public TreeNode buildTree(int[] inorder, int[] postorder, int[] range1 ,int[] range2) {
        //递归终止
        if(range1[0]>=range1[1] || range2[0]>=range2[1]) {
            return range1[0]==range1[1]? new TreeNode(inorder[range1[0]]): null;
        }
        //从inorder中找到当前根节点
        int rootVal = inorder[range1[0]];
        int leftTreeEnd = 0, rightTreeStart = 0;
        //在postorder中找到root的左右子树节点范围
        for(int i=range2[0]; i<=range2[1]; i++) {
            if(rootVal==postorder[i]) {
                leftTreeEnd = i-1;
                rightTreeStart = i+1;
            }
        }
        TreeNode root = new TreeNode(rootVal);
        //递归构建左右子树
        TreeNode leftRoot = buildTree(inorder, postorder, 
            new int[]{range1[0]+1, range1[0]+leftTreeEnd+1-range2[0]}, 
            new int[]{range2[0], leftTreeEnd}
        );
        TreeNode rightRoot = buildTree(inorder, postorder, 
            new int[]{range1[0]+leftTreeEnd+2-range2[0], range1[1]},
            new int[]{rightTreeStart, range2[1]} 
        );
        root.left = leftRoot;
        root.right = rightRoot;

        return root;
    }
}
posted @ 2020-09-16 18:41  CodeSPA  阅读(187)  评论(0编辑  收藏  举报