- 最头疼的就是做树的题目了,虽然说遇到树,想到的就是递归,想到的就是深度优先搜索,但是总感觉没有get到它的精华所在。
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
附上原题链接
- 对于这道题目,前序遍历的第一个节点一定是这个树或者某个子树的根节点,那么这样就好办了,遍历前序数组,然后在中序遍历数组中找到相应的数所在位置,就可以将在中序遍历中划分出左子树和右子树了,然后递归进行

class Solution {
HashMap<Integer,Integer> map = new HashMap();
int ind = 0;
public TreeNode buildTree(int[] preorder, int[] inorder) {
int index = 0;
for(int i:inorder){
map.put(i,index++);
}
return help(preorder,0,inorder.length);
}
public TreeNode help(int[] preorder,int left,int right){
if(left == right){
return null;
}
TreeNode root = new TreeNode(preorder[ind]);
int index = map.get(preorder[ind]);
ind++;
root.left = help(preorder,left,index);
root.right = help(preorder,index+1,right);
return root;
}
}