【题目】
已知一棵二叉树所有的节点值都不同,给定这棵树正确的先序和中序数组,不要重建整棵树,而是通过这两个数组直接生成正确的后序数组。
【基本思路】
根据当前的先序和中序数组,设置后序数组最右边的值,然后划分出左子树的先序、中序数组,以及右子树的先序、中序数组,先根据右子树的划分设置好后序数组,再根据左子树的划分,从右边到左边依次设置好后序数组的全部位置。
【代码】
//通过先序和中序数组生成后序数组
public static int[] getPosArray(int[] pre,int[] in){
if(pre==null || in==null){
return null;
}
int len=pre.length;
int[] pos=new int[len];
HashMap<Integer,Integer> map=new HashMap<Integer,Integer>();
for(int i=0;i<len;i++){
map.put(in[i],i);
}
setPos(pre,0,len-1,in,0,len-1,pos,len-1,map);
return pos;
}
//从右往左一次填好后序数组s
//si为后序数组s该填的位置
//返回值为s该填的下一个位置
private static int setPos(int[] p, int pi, int pj, int[] n, int ni, int nj,
int[] s, int si, HashMap<Integer, Integer> map) {
if(pi>pj){
return si;
}
s[si--]=p[pi];
int i=map.get(p[pi]);
si=setPos(p,pj-nj+i+1,pj,n,i+1,nj,s,si,map);
return setPos(p,pi+1,pi+i-ni,n,ni,i-1,s,si,map);
}
//二叉树节点间的最大距离问题
public static int maxDistance(Node head){
int[] record=new int[1];
return posOrder(head,record);
}