package test;
public class SubTree {
/**
* 已知二叉树前序和中序,求后序
* @param pre
* @param mid
* @param last
* @param i
*/
public static int i =0;//i:表示要插入后序序列的位置对于生成的后序序列,应该从最后位置开始写,
// 所以在main中将值赋成mid.length-1。这里将i定义成全局变量,是因为如果序列长度为1时,
// i--无法返回i的值,暂时没有想到其它方法。Integer已经试过,不行。
public void getLast(char[] pre, char[] mid, char[] last){
if(pre.length<=1){//如果序列的长度小于等于1,将该序列中的元素插入last序列,然后返回
last[i]=pre[0];
System.out.println(i);
i--;
return;
}
else{//如果序列长度大于1,则将二叉树的根插入last序列,然后将序列分成两个,分别进行递归
last[i] = pre[0];
i--;
int j =0;
for(;j<mid.length&&pre[0]!=mid[j];j++);//在mid中找到根元素,从此处将mid分成两部分
char[] newmid1 = new char[j];
char[] newmid2 = new char[mid.length-j-1];
char[] newpre1 = new char[j];
char[] newpre2= new char[mid.length-j-1];
if(j<mid.length-1){//求后子树的后序序列
for(int n=0;n<mid.length-j-1;n++){
newmid2[n] = mid[n+j+1];
newpre2[n] = pre[n+j+1];
}
getLast(newpre2,newmid2,last);
}
if(j>0){//求前子树的后序序列
for(int m =0;m<j;m++){
newmid1[m]=mid[m];
newpre1[m]=pre[m+1];
}
getLast(newpre1,newmid1,last);
}
}//else
}
public static void main(String[] args){
SubTree st = new SubTree();
char[] pre = {'A','B','C','D','E','F','G'};
char[] mid = {'C','D','B','E','A','G','F'};
// char[] pre = {'B','C','D','E'};
// char[] mid = {'C','D','B','E'};
// char[] pre = {'F','G'};
// char[] mid = {'G','F'};
char[] last = new char[pre.length];
i = mid.length-1;
st.getLast(pre, mid,last);
for(int j=0;j<last.length;j++)
System.out.print(last[j]);
}
}
输出结果:DCEBGFA