根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
思路:由preorder数组我们可以很容易确定树的树根,然后我们知道,树根元素在inorder数组中的索引值是很重要的,该索引值前边是以该点为根的左子树,索引值后边是以该点为根的右子树,之后在左右子树中重复操作即可。
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
class Solution {
int pre_index=0;
int[] preorder;
int[] inorder;
HashMap<Integer,Integer> idx_map=new HashMap<Integer,Integer>();
public TreeNode buildTree(int[] preorder, int[] inorder) {
this.preorder=preorder;
this.inorder=inorder;
int idx=0;
for(Integer val:inorder)
idx_map.put(val, idx++);
return findAns(0,inorder.length);
}
private TreeNode findAns(int l,int r)
{
if(l==r) return null;
int root_val=preorder[pre_index];
TreeNode root=new TreeNode(root_val);
int index=idx_map.get(root_val);
pre_index++;
root.left=findAns(l,index);
root.right=findAns(index+1,r);
return root;
}
}