根据任意二叉树的先序遍历和中序遍历求解后序遍历
设计一个算法实现以下功能:
给定任意一棵二叉树的先序遍历和中序遍历的结果,请根据这两个遍历结果,求出它的后序遍历结果。
输入参数:先序遍历结果 中序遍历结果
输出参数:后序遍历结果
参考样例:
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;
}
第一次发博客,谢谢支持