Vijos P1132 求二叉树的先序序列(递归,二叉树)

原创 2016年08月30日 10:15:18
P1132求二叉树的先序序列

描述

给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度≤8)。

格式

输入格式

第一行为二叉树的中序序列
第二行为二叉树的后序序列

输出格式

一行,为二叉树的先序序列

样例1

样例输入1[复制]

BADC
BDCA

样例输出1[复制]

ABCD

限制

每个测试点1s

来源

noip2001普及组第三题

思路

1)输入中序序列in,后序序列post

2)中序序列按“左根右”遍历二叉树所得,后序序列按“左右根”遍历所得,故post的最后一个为树根ch

3)树根ch为后序序列post的最后一个字符,即ch=post[len-1],其中len为串长,即post.size()

4)样例中,由post找到根,然后由in分出左子树和右子树

in:   BADC

post:BDCA

5)左子树为B,右子树为DC

6)先在in中找根的位置n=in.find(ch);

7)则左子树中序序列为in.substr(0,n),后序序列为post.substr(0,n)

8)右子树的先序序列为in.subst(n+1,len-n-1),后序序列为post.substr(n,len-n-1)

9)通过递归不断重复以后步骤,当串为空时退出

代码

#include <iostream>
using namespace std;
string in,post;
void tree(string sa,string sb)
{
	int n,len=sb.size();			//求串长 
	char ch=sb[len-1];				//根据后序序列求出根 
	if(sb.empty()) return;			//串为空时结束 
	cout<<ch;						//前序遍历,先输出根 
	n=sa.find(ch);					//找到根在中序序列中的位置 
	tree(sa.substr(0,n),sb.substr(0,n));	//根之前的为左子树,递归求左子树的根 
	tree(sa.substr(n+1,len-n-1),sb.substr(n,len-n-1));	//根之后的为右子树,递归求右子树的根 
}
int main()
{
	cin>>in>>post;		//输入中序和后序序列 
	tree(in,post);		//根据中序和后序输出中先序序列 
	return 0;
}


已知二叉树先序序列和中序序列,求后序序列

回答了百度知道上的一个提问,原题是这样的: 当一棵二叉树前序序列和中序序列分别为HGEDBFCA和EGBDHFAC时,其后序序列为什么?当一棵二叉树前序序列和中序序列分别为HGEDBFCA和EGBDH...
  • u011215133
  • u011215133
  • 2017年06月15日 11:06
  • 1230

数据结构(二叉树系列)先序创建三种遍历和求深度(递归实现)

typedef struct BiTNode{ // 二叉树结点结构 char data; // 结点数据 struct BiTNode *lchild; // 左孩子 struct BiTNode ...
  • mr253727942
  • mr253727942
  • 2014年11月12日 20:21
  • 696

根据二叉树的先序与中序序列或后续与中序序列恢复二叉树并图像化打印(c语言)

先以先序和中序恢复来说: 1.首先我们是使用递归的方式来完成 2.递归的最小单元是:给一个空树和这个书的中序与先序序列,那么先序序列的第一个元素就是该树的根节点,同样在恢复左右子树递归调用这个方法 3...
  • ydcun
  • ydcun
  • 2014年04月26日 10:59
  • 1480

根据先序序列和中序序列创建二叉树

思考:如何才能确定一棵树? 结论:    通过中序遍历和先序遍历可以确定一个树                 通过中序遍历和后续遍历可以确定一个树                 通过先序遍历和后序...
  • bbs375
  • bbs375
  • 2016年10月06日 19:12
  • 7427

根据前序遍历序列和中序遍历序列创建二叉树

一个前序遍历序列和一个中序遍历序列可以确定一颗唯一的二叉树。        根据前序遍历的特点, 知前序序列(PreSequence)的首个元素(PreSequence[0])为二叉树的根(root...
  • fengxinlinux
  • fengxinlinux
  • 2016年10月27日 21:56
  • 1554

从前序+中序或者后序+中序序列中恢复二叉树过程

给出前序遍历和中序遍历,如何绘制出二叉树: 如果给出遍历产生的一串字符,不容易确定各个字符在树中的具体位置,因而需要两个遍历串相结合才能画出一棵二叉树。 如,给出前序遍历ADFGHKLPQRWZ,...
  • dalong277
  • dalong277
  • 2016年04月26日 11:18
  • 1522

二叉树系列(一):已知先序遍历序列和中序遍历序列,求后序遍历序列

首先介绍一下三种遍历顺序的操作方法:   1.先序遍历   (1)访问根结点;   (2)先序遍历左子树;   (3)先序遍历右子树。   2.中序遍历   (1)中序遍历左子树; ...
  • u010926964
  • u010926964
  • 2014年10月07日 19:27
  • 4223

第4章第1节练习题14 满二叉树已知先序序列求解后序序列

设有一颗满二叉树(所有节点值均不同),已知其先序序列pre,设计一个算法求其后序序列post...
  • u013595419
  • u013595419
  • 2016年08月25日 11:50
  • 871

二叉树的非递归遍历以及层次遍历(前序、中序、后序)

先使用先序的方法建立一棵二叉树,然后分别使用递归与非递归的方法实现前序、中序、后序遍历二叉树,并使用了两种方法来进行层次遍历二叉树,一种方法就是使用STL中的queue,另外一种方法就是定义了一个数组...
  • yusiguyuan
  • yusiguyuan
  • 2014年11月07日 21:11
  • 1636

算法之二叉树中序前序序列(或后序)求解树

这种题一般有二种形式,共同点是都已知中序序列。如果没有中序序列,是无法唯一确定一棵树的。 已知二叉树的前序序列和中序序列,求解树。 1、确定树的根节点。树根是当前树中所有元素在前序遍历中最先出现的...
  • SJF0115
  • SJF0115
  • 2013年03月08日 10:56
  • 17436
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Vijos P1132 求二叉树的先序序列(递归,二叉树)
举报原因:
原因补充:

(最多只允许输入30个字)