package leetcode;
import java.util.HashMap;
public class offer_07 {
public TreeNode buildTree(int[] preorder, int[] inorder) {
HashMap<Integer, Integer>map=new HashMap<Integer, Integer>();
//存储中序遍历中节点的位置
for(int i=0;i<inorder.length;i++) {
map.put(inorder[i], i);
}
return build(preorder, inorder, 0, preorder.length-1, 0, preorder.length-1,map);
}
public TreeNode build(int[] preorder,int[] inorder,int preleft,int preright,int inleft,int inright,HashMap<Integer, Integer>map) {
if(preleft>preright) {
return null;
}
//先序遍历第一个节点即为根节点
int preroot=preleft;
//找出中序遍历中根节点的位置
int inroot=map.get(preorder[preroot]);
//新建一个节点
TreeNode root=new TreeNode(preorder[preroot]);
//左子树节点的数目
int leftsize=inroot-inleft;
//递归找出左子树的每一个根节点
//下一个根节点是先序表中当前元素的下一个元素,结束位置是当前元素加上全部左子树,而中序遍历起始位置没有变
root.left=build(preorder,inorder,preleft+1,preleft+leftsize,inleft,inroot-1,map);
//递归找出右子树的每一个根节点
//下一个根节点是先序表中当前元素加上全部左子树的下一个元素,结束位置是全部元素,中序遍历起始位置根节点元素的下一个位置到结束元素
root.right=build(preorder,inorder,preleft+leftsize+1,preright,inroot+1,inright,map);
return root;
}
}