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;
}
第一次發博客,謝謝支持吐舌頭
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章