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

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值