描述
给出一个二叉树的中序遍历和后序遍历,求出二叉树的前序遍历
输入
共两行,第一行为二叉树的中序遍历,第二行为后序遍历,字符串为大写字母,长度不超过26字符,每个字符表示一个节点
输出
只有一行,为树的前序遍历
输入样例 1
ACBDFEG ABDCGEF
输出样例 1
FCADBEG
代码
#include <bits/stdc++.h>
using namespace std;
const int M=30;
char xian[M],zhong[M],hou[M];
struct point
{
char mb;
point *l,*r;
point (char mb='0',point *l=NULL,point *r=NULL)
{
this->mb=mb;
this->l=l;
this->r=r;
}
};
void buildtree(int l,int r,int &t,point* &root) \\建树函数
{
int flag=-1;
for(int i=l; i<=r; i++)
{
if(zhong[i]==hou[t]) \\找到根结点在中序序列中的位置
{
flag=i;
break;
}
}
if(flag==-1) return;
root=new point(hou[t]);
t--; \\得到新的根结点在数组中的下标
if(flag<r) buildtree(flag+1,r,t,root->r); \\知后序序列从右往左构建树
if(flag>l) buildtree(l,flag-1,t,root->l);
}
void xiantravel(point * root) \\先序遍历
{
if(root!=NULL)
{
cout<<root->mb;
xiantravel(root->l);
xiantravel(root->r);
}
}
void zhongtravel(point * root) \\中序遍历
{
if(root!=NULL)
{
zhongtravel(root->l);
cout<<root->mb;
zhongtravel(root->r);
}
}
void houtravel(point * root) \\后序遍历
{
if(root!=NULL)
{
houtravel(root->l);
houtravel(root->r);
cout<<root->mb;
}
}
void delete_tree(point *root) \\删除new开辟的空间
{
if(root==NULL) return;
delete_tree(root->r);
delete_tree(root->l);
delete root;
}
int main()
{
cin>>zhong>>hou;
int n=strlen(hou);
point *root;
int t=n-1; \\后序序列中根结点在尾部
buildtree(0,n-1,t,root);
xiantravel(root);
cout<<endl;
delete_tree(root); \\删不删无所谓
return 0;
}