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;
}
}