poj2255 根据任意二叉树的先序遍历和中序遍历求解后序遍历

原题大意:

根据任意二叉树的先序遍历和中序遍历求解后序遍历

设计一个算法实现以下功能:

给定任意一棵二叉树的先序遍历和中序遍历的结果,请根据这两个遍历结果,求出它的后序遍历结果。

输入参数:先序遍历结果 中序遍历结果

输出参数:后序遍历结果

参考样例:

Example :

Input :DBACEGF ABCDEFG

Output :ACBFGED

 

Test Data :

Input :BCAD CBAD

Output :CDAB


主要算法描述及分析

   (1)将字符串序号从e到t的字串存到k数组里,并返回k数组指针,复杂度o(n)

       char* copy(char a[],int e,int t)

      { 

          char *k=new char[t-e+2];

          int i, j;

          for( i=e, j=0;i<=t;i++,j++)

              k[j]=a[i];

          k[t-e+1]=0;

          return k;

   }

 

  (2)找到q数组中(序号从小到大)第一个与p数组中存在相同元素时,p数组的序号(注意是p数组),复杂度o(n*n)

         int relate(char p[],char q[])

        {

             for(int i=0;q[i]!=0;i++)

             {

                  for(int j=0;j<strlen(p);j++)

                  {

                         if(q[i]==p[j])

                        { 

                           return j;           

                         }

                 }

          }

      }


  (3)用递归输出后序遍历的结果,算法复杂度为o(n)

     是类似于给中序遍历的结果打括号,然后再按后序遍历输出

     例如 :bcad cbad

     用了这个算法后:

            <1>对(cbad)得((c)b(ad));

            <2>对(c)用此算法(由于只有c一个,即输出c,返回上一级);

            <3>对(ad)用此算法,得(a(d));

            <4>对(d)用此算法,输出d,返回上一级;

            <5>输出a;

            <6>输出b;

            <7>退出递归;

代码如下:

 

#include<iostream>
#include<cstring>
using namespace std;

char* copy(char a[],int e,int t)
{
     char *k=new char[t-e+2];
     int i, j;
     for( i=e, j=0;i<=t;i++,j++)
     k[j]=a[i];
     k[t-e+1]=0;
     return k;
}

int relate(char p[],char q[])
{
    for(int i=0;q[i]!=0;i++)
    {
            for(int j=0;j<strlen(p);j++)
            {
                    if(q[i]==p[j])
                    {
                        return j;           
                    }
                    
                       
            }
    }

}
 
void print(char q[],int lx,char p[])
{
     if(strlen(q)==1)
     {
         cout<<q[0];
         return;
     }
     if(lx>0)
     {
          char *s=new char[lx];
          s=copy(q,0,lx-1);
          int u=relate(s,p);
          print(s,u,p);
     }
     if(strlen(q)-lx-1>0)
     {
          char *c=new char[strlen(q)-lx-1];
          c=copy(q,lx+1,strlen(q)-1);
          int v=relate(c,p); 
          print(c,v,p);
     }
     cout<<q[lx];
}

int main()
{
    char xx[1000],zx[1000];
    while(cin>>xx>>zx)
    {
          int t=relate(zx,xx);
          print(zx,t,xx);
          cout<<endl;
    }
    return 0;
}
第一次发博客,谢谢支持 吐舌头

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值