题目:
根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
思路:
通过前序遍历获取根节点的val,通过val和中序遍历划分左子树右子树
遍历区间左闭右开
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
class Solution {
private int[] preorder;
private int[] inorder;
private int preindex = 0;
Map<Integer, Integer> inorder_map = new HashMap<>();
public TreeNode buildTree(int[] preorder, int[] inorder) {
this.preorder = preorder;
this.inorder = inorder;
// build a hashmap value -> its index
for (int index = 0; index < inorder.length; index++) {
inorder_map.put(inorder[index], index);
}
return helper(0, inorder.length);
}
public TreeNode helper(int start, int end) {
//定义递归出口==也就是失效范围
if (start == end) {
return null;
}
int root_val = preorder[preindex];
TreeNode root = new TreeNode(root_val);
int index = inorder_map.get(root_val);
preindex++;
// build left subtree
root.left = helper(start, index);
root.right = helper(index + 1, end);
return root;
}
}