算法训练 求先序排列(二叉树的建立)

  算法训练 求先序排列  
时间限制:1.0s   内存限制:256.0MB
       
问题描述
  给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度<=8)。
输入格式
  两行,每行一个字符串,分别表示中序和后序排列
输出格式
  一个字符串,表示所求先序排列

   样例输入
  BADC
  BDCA
样例输出
ABCD

 

对于中序和后序排列求前序序列,本来以为要通过建树来实现,发现并不是那么回事,可以通过一定的规律来实现

首先对于后序序列,最后一个肯定是最上面的根节点,那么在中序序列里面找到根节点的位置,然后根据根节点的位置来实现分别遍历左子树和右子树,对于左子树也是先通过后序列序列找到根节点的位置,然后对应中序序列的位置对应左子树和右子树

此题目的一个思考的地方是,关于后序序列中的根节点,如果一旦在中序序列中找出,便可以得到左子树和右子树的个数,从而得到进入下一个子树的里面的根节点

#include<cstdio>
#include<cstring>
#define MAX 10

char mid[MAX],later[MAX];

void tree(int l,int r,int st,int ed)
{
	int temp=later[ed];
	if(l>r||st>ed)
	{
		return ;
	}
	else
	{
		printf("%c",temp);
		for(int i=l;i<=r;i++)
		{
			if(temp==mid[i])
			{
				tree(l,i-1,st,st+(i-1-l));
				tree(i+1,r,st+(i-l-1)+1,ed-1);
				return ;
			}
		}
	}
	return ;
}

int main()
{
	scanf("%s",mid);
	scanf("%s",later);
	int len=strlen(mid);
	tree(0,len-1,0,len-1);
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值