根據任意二叉樹的先序遍歷和中序遍歷求解後序遍歷
設計一個算法實現以下功能:
給定任意一棵二叉樹的先序遍歷和中序遍歷的結果,請根據這兩個遍歷結果,求出它的後序遍歷結果。
輸入參數:先序遍歷結果 中序遍歷結果
輸出參數:後序遍歷結果
參考樣例:
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;
}
第一次發博客,謝謝支持