二叉树-已知前序序列和中序序列,求后序序列

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值