984: 利用二叉树中序及先序遍历确定该二叉树的后序序列
题目描述
已知二叉树的中序和先序遍历可以唯一确定后序遍历、已知中序和后序遍历可以唯一确定先序遍历,但已知先序和后序,却不一定能唯一确定中序遍历。现要求根据输入的中序遍历结果及先序遍历结果,要求输出其后序遍历结果。
输入
输入数据占2行,其中第一行表示中序遍历结果,第二行为先序遍历结果。
输出
对测试数据,输出后序遍历结果。
样例输入
BFDAEGC
ABDFCEG
样例输出
FDBGECA
思路:见我的上一篇博客983的思路即可
#include<bits/stdc++.h>
using namespace std;
typedef struct tree
{
char data;
struct tree *lchild, *rchild;
}tree;
tree *f(char *fir, char *mid, int n)//树的“嫁接”,中+前->后
{
tree *t;
char *p;
int k=0;
if(n==0) return NULL;//n==0说明没有左子树
t = new tree();
t->data=fir[0];//和983的区别
for(p = mid;p< mid+n ; p++)//指针可以写成p++哟
{
if(*p==fir[0]) break;//和983的区别
k++;//记录结点
}
t->lchild=f(fir+1,mid,k);//左子树根节点
t->rchild=f(fir+k+1,mid+k+1,n-k-1);//右子树根节点
return t;
}
void print(tree *&t)//后序输出
{
if(t!=NULL)
{
print(t->lchild);
print(t->rchild);
cout << t->data;//和983的区别
}
}
int main()
{
char mid[1000], fir[1000];//mid存放中序序列, fir存放先序序列
tree *t;
cin >> mid >> fir;//分别输入中序,先序序列
t=f(fir, mid, strlen(mid));
print(t);
return 0;
}
以上方法仅供参考,欢迎互联网的广大朋友们提出指正。