思路:本题采用分治算法。根据先序遍历确定根结点,再根据根结点确定中序遍历中的左右子树。
int[] preorder;
HashMap<Integer,Integer> dic=new HashMap<>();
public TreeNode buildTree(int[] preorder, int[] inorder){
this.preorder=preorder;//先序
for(int i=0;i<inorder.length;i++){
dic.put(inorder[i],i);
}
return recur(0,0,inorder.length-1);//根结点是先序数组的坐标,左右子树是参照中序遍历,所以是中序数组的坐标
}
public TreeNode recur(int root,int left,int right){
if(left>right) return null;
TreeNode node=new TreeNode(preorder[root]);
int i=dic.get(preorder[root]);
node.left=recur(root+1,left,i-1);
node.right=recur(root+i-left+1,i+1,right);
return node;
}