题目描述
二叉树的前序、中序、后序遍历的定义:
前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树;
中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树;
后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根。
给定一棵二叉树的前序遍历和中序遍历,求其后序遍历(提示:给定前序遍历与中序遍历能够唯一确定后序遍历)。
输入
两个字符串,其长度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;
//根据先序序列pre[pre_low..pre_low+len-1]和中序序列in[in_low..in_low+len-1]建树t
void BuildTree(BiTree& t, char pre[], int pre_low, char in[], int in_low, int len)
{
t = new BiTNode;
if (t)
{
if (len <= 0)
{
t = NULL;
return;
}
t->data = pre[pre_low];
int i = 0;
while (in[in_low + i] != t->data)
i++;
BuildTree(t->lchild, pre, pre_low + 1, in, in_low, i);
BuildTree(t->rchild, pre, pre_low + i + 1, in, in_low + i + 1, len - (i + 1));
}
return;
}
// 后序遍历的递归算法
void PostOrderTraverse(BiTree t)
{
if (t) {
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;
}
}