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;
}


相关文章推荐

【递归】Vijos P1132 求二叉树的先序序列(NOIP2001普及组第三题)

题目链接:   https://vijos.org/p/1132 题目大意:   给定二叉树的中序和后序遍历,求该二叉树先序遍历。 题目思路:   【递归】   这题妥妥递归。   二叉树先序根左右,...

vijos p1132 求二叉树的先序序列

  • 2014年05月06日 17:26
  • 431B
  • 下载

二叉树先序递归创建及遍历

  • 2014年11月14日 00:15
  • 1KB
  • 下载

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

typedef struct BiTNode{ // 二叉树结点结构 char data; // 结点数据 struct BiTNode *lchild; // 左孩子 struct BiTNode ...

先序非递归遍历二叉树解析——面试高频数据结构

一、基本概念 二叉树是笔试面试中高频数据结构。 而二叉树的遍历是解决一切二叉树题目的基础。因此,有必要熟练掌握二叉树的遍历方法,包括递归方法 和 非递归方法。 由于递归方法比较简单,因此,这里我...

由先序与中序序列构造二叉树

  • 2013年11月19日 23:09
  • 1015B
  • 下载

数据结构六:二叉树的先序建树与中序的非递归遍历算法

熟悉二叉树的遍历建树过程有利于对后文线索化二叉树的学习          对于数据结构中二叉树特殊的结构,经过一段时间的温习发现自己基础并不是很牢靠,所以写下这篇博文也是记录一下自己的学习过程,给日...
  • szqsdq
  • szqsdq
  • 2015年08月20日 14:40
  • 679
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Vijos P1132 求二叉树的先序序列(递归,二叉树)
举报原因:
原因补充:

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