1. 一开始蒙了,完全没思路。然后看了一下官方题解视频,提到用递归,而preorder头部都是root。就继续自己想了一下,写出来了。
2. 主要是前序和中序遍历的特点。前序递归提供root,中序递归提供left和right,其他就是一下简单计算。分治法。
3. 还有个问题,如果题目里面数字不重复去掉呢? 想了一下,还是可以用这种方法,不过hash出来两个index,选择前面那个就可以。具体可以hash的value为list。
4. 执行用时:2 ms ,超过98%;内存消耗:40.1 MB,超过67%;
class Solution {
Map<Integer,Integer> mapIn = new HashMap<Integer,Integer>();
public TreeNode buildTree(int[] preorder, int[] inorder) {
for(int i = 0; i < inorder.length; i++){
mapIn.put(inorder[i], i);
}
return buildTreeHelp(inorder,0, inorder.length-1, preorder, 0);
}
public TreeNode buildTreeHelp(int[] inorder, int left,int right, int[] preorder,int index){
if(right<left){
return null;
}
TreeNode root = new TreeNode(preorder[index]);
int tempIndex = mapIn.get(preorder[index]);
root.left = buildTreeHelp(inorder, left,tempIndex-1,preorder,index+1 );
root.right = buildTreeHelp(inorder,tempIndex+1, right, preorder, index + tempIndex-left +1);
return root;
}
}