import java.util.*;
public class Solution {
HashMap<Integer,Integer> map;
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
int preLen = pre.length;
int inLen = in.length;
if(pre.length != in.length){
throw new RuntimeException("输入有误!");
}
//需要频繁在中序中找到根结点的位置,使用map将数组的遍历查询改为直接查询
map = new HashMap();
for(int index = 0; index < in.length; index++){
map.put(in[index],index);
}
return build(pre, 0, preLen-1, in, 0, inLen-1);
}
private TreeNode build(int[] pre, int preStart, int preEnd, int[] in, int inStart, int inEnd){
//1. 终止条件
if(preStart > preEnd || inStart > inEnd){
return null;
}
//2. 创建根结点
TreeNode root = new TreeNode(pre[preStart]);
//3. 在中序中找到根结点位置,即左右子树的分割界限
int inindex = map.get(pre[preStart]);
//4. 在前序中找到左右子树的分割界限:左子树的最后一位元素索引
int preindex = inindex - inStart + preStart;
//5. 递归获取左右子树根结点,连接在根结点上
root.left = build(pre, preStart+1, preindex, in, inStart, inindex-1);
root.right = build(pre, preindex+1, preEnd, in, inindex+1, inEnd);
//6. 返回根结点
return root;
}
}