树-由先序和中序序列求后序序列
Q:给定一棵二叉树的前序遍历和中序遍历,求其后序遍历。
输入:两个字符串,一行为前序遍历,第二行为中序遍历
样例:import:abc bac output:bca
代码:
#include<stdio.h>
#include<string.h>
struct Node
{
Node *lchild;
Node *rchild;
char c;
}Tree[50];//构建树的结点结构,此处用静态数组。
int loc;//静态空间中已使用结点个数
char str1[50];
char str2[50];
void postorder(Node *T)//后序遍历函数
{
if(T->lchild!=NULL)
{
postorder(T->lchild);
}
if(T->rchild!=NULL)
{
postorder(T->rchild);
}
printf("%c",T->c);
}//
Node *creat()//结点定义及初始化
{
Tree[loc].lchild=Tree[loc].rchild=NULL;//**************注意此处不是指针,不要将'.'与'->'混淆,后者是用于指针。
return &Tree[loc++];
}
Node *build(int s1,int e1,int s2,int e2) //根据前序遍历,中序遍历来构建二叉树
{
Node *t=creat();
int m;
t->c=str1[s1];
for(int i=s2;i<=e2;i++)
{
if(str2[i]==t->c)
{
m=i;
break;
}
}
if(m!=s2)
{
t->lchild=build(s1+1,s1+m-s2,s2,m-1);
}
if(m!=e2)
{
t->rchild=build(s1+m-s2+1,e1,m+1,e2);
}
return t;
}
int main()
{
while(scanf("%s%s",str1,str2)!=EOF)
{
int loc=0;
Node *T=build(0,strlen(str1)-1,0,strlen(str2)-1);
postorder(T);
}
return 0;
}

浙公网安备 33010602011771号