题目描述
二叉树的前序、中序、后序遍历的定义:
前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树;
中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树;
后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根。
给定一棵二叉树的前序遍历和中序遍历,求其后序遍历(提示:给定前序遍历与中序遍历能够唯一确定后序遍历)。
输入
两个字符串,其长度n均小于等于26。
第一行为前序遍历,第二行为中序遍历。
二叉树中的结点名称以大写字母表示:A,B,C…最多26个结点。
输出
输入样例可能有多组,对于每组测试样例,
输出一行,为后序遍历的字符串。
样例输入 Copy
ABC
CBA
ABCDEFG
DCBAEFG
样例输出 Copy
CBA
DCBGFEA
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
using namespace std;
typedef char TElemType;
//二叉树的二叉链表存储表示
typedef struct BiTNode {
TElemType data; //结点数据域
struct BiTNode *lchild, *rchild; //左右孩子指针
} BiTNode, *BiTree;
void BuildTree(BiTree& t, char pre[], int pre_low, char in[], int in_low, int len)//*树,前序序列,前序的头,中序序列,*//
{
if(len==0)
{
t=NULL;
return ;
}
int k;
for(k=0; k<len; k++)
{
if(pre[pre_low]==in[in_low+k])
break;
}
t=new BiTNode;
t->data=pre[pre_low];
BuildTree(t->lchild,pre,pre_low+1,in,in_low,k);
BuildTree(t->rchild,pre,pre_low+k+1,in,in_low+k+1,len-1-k);//*前序构建树*//
}
// 后序遍历的递归算法
void PostOrderTraverse(BiTree t)
{
/****在此下面完成代码************/
if( t!=NULL ){
PostOrderTraverse( t->lchild );
PostOrderTraverse( t->rchild );
cout << t->data;
}
/*********************************/
}
void DestroyBitree(BiTree& t)
{
/****在此下面完成代码************/
if(t)
{
DestroyBitree(t->lchild);
DestroyBitree(t->rchild);
free(t);
}
/*********************************/
}
int main()
{
char pre[30], in[30];
BiTree t = NULL;
while(cin >> pre) {
cin >> in;
BuildTree(t, pre, 0, in, 0, strlen(in));
PostOrderTraverse(t);
DestroyBitree(t);
cout << endl;
}
}