关闭

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

标签: vijosNOIP递归二叉树
70人阅读 评论(0) 收藏 举报
分类:
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;
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:9963次
    • 积分:627
    • 等级:
    • 排名:千里之外
    • 原创:56篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条
    文章存档