重建二叉树
重建二叉树
https://www.nowcoder.com/practice/8a19cbe657394eeaac2f6ea9b0f6fcf6?tpId=196&tags=&title=&diffculty=0&judgeStatus=0&rp=1&tab=answerKey
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
if (pre==null || in==null) return null;
return dfs(pre,0,pre.length-1,in,0,in.length-1);
}
private TreeNode dfs(int[] pre, int ps, int pe, int[] in, int ins, int ine) {
//一般发生在pre下标ps或者pe的值处于in在区间ins和ine的两端处
if (ps>pe || ins>ine) return null;
if (ps==pe) {
TreeNode tn=new TreeNode(pre[ps]);
return tn;
}
int temp = pre[ps];
int index = getIndex(temp,in,ins,ine);
//ins index-1 左子树 index+1 ine 右子树
//ps+1 ps+1+index-1-ins=index+ps-ins 左子树 index+ps-ins+1 pe右子树
TreeNode left = dfs(pre,ps+1,index+ps-ins,in,ins,index-1);
TreeNode right = dfs(pre,index+ps-ins+1,pe,in,index+1,ine);
TreeNode root = new TreeNode(temp);
root.left=left;
root.right=right;
return root;
}
private int getIndex(int temp,int[] in, int ins, int ine) {
for (int i=ins;i<=ine;i++){
if(in[i]==temp){
return i;
}
}
return 0;
}
巨人网络成长空间 50人发布