SWUST OJ 983: 利用二叉树中序及后序遍历确定该二叉树的先序序列

983: 利用二叉树中序及后序遍历确定该二叉树的先序序列

题目描述
已知二叉树的中序和先序遍历可以唯一确定后序遍历、已知中序和后序遍历可以唯一确定先序遍历,但已知先序和后序,却不一定能唯一确定中序遍历。现要求根据输入的中序遍历结果及后序遍历结果,要求输出其先序遍历结果。

输入

第一行为中序序列 第二行为后续序列

输出

输出为遍历二叉树得到的先序序列

样例输入

BFDAEGC
FDBGECA

样例输出

ABDFCEG

思路:

  1. 了解前中后三种遍历二叉树的顺序:
  • 先序遍历:根–>左–>右 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;
	 } 
}
  1. 构建二叉树
    ①先找根结点,由后序遍历的特点,根结点在最后,所以根结点为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;
 } 

以上方法仅供参考,欢迎互联网的广大朋友们提出指正。

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值