983: 利用二叉树中序及后序遍历确定该二叉树的先序序列
题目描述
已知二叉树的中序和先序遍历可以唯一确定后序遍历、已知中序和后序遍历可以唯一确定先序遍历,但已知先序和后序,却不一定能唯一确定中序遍历。现要求根据输入的中序遍历结果及后序遍历结果,要求输出其先序遍历结果。
输入
第一行为中序序列 第二行为后续序列
输出
输出为遍历二叉树得到的先序序列
样例输入
BFDAEGC
FDBGECA
样例输出
ABDFCEG
思路:
- 了解前中后三种遍历二叉树的顺序:
- 先序遍历:根–>左–>右 ABGDECFH
- 中序遍历:左–>根–>右 GBEDAFCH
- 后序遍历:左–>右–>根 GEDBFHCA
(注:前序也称为先序)
代码实现:
typedef struct Tree
{
char data;
struct Tree *lchild, *rchild;
}Tree;
void f1(Tree *&t) //先序遍历
{
if(t!=NULL)
{
printf("%c", t->data);//等价于 cout << t->data;
f1(t->lchild);
f1(t->rchild);
}
}
void f2(Tree *&t)//中序遍历
{
if(t!=NULL)
{
f2(t->lchild);
printf("%c", t->data);//等价于 cout << t->data;
f2(t->rchild);
}
}
void f3(Tree *&t)//后序遍历
{
if(t!=NULL)
{
f3(t->lchild);
f3(t->rchild);
printf("%c", t->data);//等价于 cout << t->data;
}
}
- 构建二叉树
①先找根结点,由后序遍历的特点,根结点在最后,所以根结点为A;
②再由中序遍历可以知道左子树和右子树分别为GBED、FCH;
③然后按照递归分别求出左右子树;
④最后按照先序方法输出即可求解。
【拓展】
先+中->后,中+后->先;
切忌前+后->中(这种情况所求二叉树不唯一)
#include<bits/stdc++.h>
using namespace std;
typedef struct tree
{
char data;
struct tree *lchild, *rchild;
}tree;
tree* f(char *last, char *mid, int n)//树的“嫁接”,中+后->前
{
tree *t;
char *p;
int k=0;
if(n==0)return 0;//n==0时说明没有左子树
t=new tree();
t->data=last[n-1];
for(p=mid;p<mid+n;p++)
{
if(*p==last[n-1]) break;
k++;//记录结点
}
t->lchild=f(last, mid, k);//左子树根节点
t->rchild=f(last+k, mid+k+1, n-k-1);//右子树根节点
return t;
}
void print(tree *&t)
{
if(t!=NULL)
{
cout << t->data;
print(t->lchild);
print(t->rchild);
}
}
int main()
{
char mid[1000], last[1000];
tree *t;
cin >>mid >>last;//分别输入中序,后序序列
t= f(last, mid, strlen(mid));
print(t);
return 0;
}
以上方法仅供参考,欢迎互联网的广大朋友们提出指正。