题目描述:
给定一棵二叉树的前序遍历和中序遍历序列,求其后序遍历续列(注:给定中序遍历序列,只要知道前序、后序或者层次遍历中的一种就能唯一的确定一棵二叉树)。
输入:
两个字符串,其长度均小于26。
第一行为前序遍历,第二行为中序遍历。二叉树的结点名称以大写字母表示:A,B,C,D.......,最多26个字母。
输出:
输入样例可能有多组,对于每组测试样例,输出一行,为后续遍历的字符串。
样例输入:
ABC
BAC
FDXEAG
XDEFAG
样例输出:
BAC
XEDGAF
问题分析:
本题目涉及二叉树的建立、遍历、还原、删除等操作。给定二叉树的前序及中序就可以唯一的确定一棵二叉树,然后对二叉树
进行后续遍历一次,就可以得到所求的后序序列。遍历采用递归的遍历,以减少代码量,免得出错。
直接看代码吧:
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<algorithm>
using namespace std;
typedef struct node //二叉树结点结构体
{
struct node * lchlid;
struct node * rchild;
char data;
}Node;
Node * Convert(char PS[],char IS[],int pl,int pr,int il,int ir)
{//由前序序列,中序序列构造二叉树的函数
if (pl<=pr)
{
Node * p=(Node *)malloc(sizeof(Node)); //分配内存,建立树结点
p->data=PS[pl];
int k =il;
while(IS[k]!=PS[pl]) k++;
p->lchlid = Convert(PS,IS,pl+1,pl+k-il,il,k-1); //递归建立左子树
p->rchild = Convert(PS,IS,pl+k-il+1,pr,k+1,ir); //递归建立右子树
return p;
}
else return NULL;
}
void PostOrder(Node * p) //二叉树的后续遍历
{
if (p!=NULL)
{
PostOrder(p->lchlid);
PostOrder(p->rchild);
printf("%c",p->data);
free(p); //销毁结点,释放内存
}
}
int main()
{
char PostStr[26],InStr[26];
while (scanf("%s%s",PostStr,InStr)!=EOF) //输入前序及后序中序序列
{
int len = strlen(PostStr);
if (len!=strlen(InStr))
{
printf("错误:输入前序序列与中序序列不等长!");exit(0);
}
Node * T = Convert(PostStr,InStr,0,len-1,0,len-1); //建立一棵二叉树
PostOrder(T); //遍历并输出二叉树的后序序列
}
return 0;
}
黑框框运行结果:
后记:
注意二叉树的结构体的定义方法,本代码使用C语言(C++稍有不同),在用malloc进行动态分配内存前要引用头文件
malloc.h,内存分配后也要在合适时候对内存进行回收。
参考了王道系列的《计算机考研——机试指南》。