105. Construct Binary Tree from Preorder and Inorder Traversal
1、原始代码
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
return buildTree(preorder, inorder, 0,0,inorder.length-1);
}
public TreeNode buildTree(int[] preorder, int[] inorder, int rootIndex,int inStart,int inEnd) {
if (inStart>inEnd|| rootIndex>= preorder.length) {
return null;
}
TreeNode root=new TreeNode(preorder[rootIndex]);
int index = 0;
for(int i=inStart;i<=inEnd;i++) {
if(inorder[i]==root.val) {
index=i;
break;
}
}
root.left = buildTree(preorder,inorder,++rootIndex,inStart,index-1);
root.right = buildTree(preorder, inorder, rootIndex+=index-inStart,index+1,inEnd);
return root;
}
}
2、使用HashMap,便于查找,只要遍历一次inorder
class Solution {
HashMap<Integer,Integer> hm=new HashMap<Integer,Integer>();
public TreeNode buildTree(int[] preorder, int[] inorder) {
for(int i=0;i<inorder.length;i++){
hm.put(inorder[i],i);
}
return buildTree(preorder, inorder, 0,0,inorder.length-1);
}
public TreeNode buildTree(int[] preorder, int[] inorder, int rootIndex,int inStart,int inEnd) {
if (inStart>inEnd|| rootIndex>= preorder.length) {
return null;
}
TreeNode root=new TreeNode(preorder[rootIndex]);
int index = hm.get(root.val);
root.left = buildTree(preorder,inorder,++rootIndex,inStart,index-1);
root.right = buildTree(preorder, inorder, rootIndex+=index-inStart,index+1,inEnd);
return root;
}
}