根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
思路与代码
递归法
- 时间复杂度:O(n),其中 nn 是树中的节点个数。
- 空间复杂度:O(n),除去返回的答案需要的 O(n) 空间之外,我们还需要使用 O(n)的空间存储哈希映射,以及 O(h)(其中 h 是树的高度)的空间表示递归时栈空间。这里 h < n,所以总空间复杂度为 O(n)。
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
Map<Integer, Integer> map = new HashMap();
for (int i = 0; i < inorder.length; i++) {
map.put(inorder[i], i);
}
return buildTreeCore(preorder, 0, inorder, 0, inorder.length-1, map);
}
public TreeNode buildTreeCore(int[] preorder, int pre_index, int[] inorder, int in_left, int in_right, Map<Integer, Integer> map) {
if (pre_index >= preorder.length) return null;
if (in_left > in_right) return null;
TreeNode node = new TreeNode(preorder[pre_index]);
int index = map.get(node.val);
node.left = buildTreeCore(preorder,pre_index + 1, inorder, in_left, index - 1, map);
node.right = buildTreeCore(preorder, pre_index + index - in_left + 1 , inorder, index + 1, in_right, map);
return node;
}
}