NOIP 2001 先序排列 题解

题目描述
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,且二叉树的节点个数
≤8)。

输入格式
共两行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。

输出格式
共一行一个字符串,表示一棵二叉树的先序。

输入输出样例
输入

BADC
BDCA

输出

ABCD

题目思路:
1.根据后序排列最后一个位置的值确定根值,去中序排列找到该值的位置,从而在中序节点将树分为中序的左右两个子树
2.假设中序左子树长度为n1,中序右子树长度为n2,去后序排列中截取出相应的后序的左右子树,循环往复

代码:

#include<stdio.h>
#include<iostream>
#include<cstring>
using namespace std;
struct Tree
{ 
	Tree *l,*r;
	char v;
}*tree;
// a中序 b 后序
//跟据b找到的根将a数组分为两部分
void px(Tree *tree1,char *a,char *b)
{
	int n=strlen(b);
	if(n==1)
	{
		tree1->v=b[0];
		return ;
	}
	// a1 b1 存储左节点的中序 后序
	// a2 b2 存储右节点的中序 后序
	char *a1,*a2,*b1,*b2;
	b1=new char[100];
	b2=new char[100];
	//根节点赋值
	tree1->v=b[n-1];
	//a2成为中序右子树
	a2=strchr(a,b[n-1]);
	a2++;
	int k=strlen(a2);
	//a1成为中序左子树
	a1=a;
	a1[n-k-1]=0;
	
	//b1成为后序左子树
	strncpy(b1,b,n-k-1);
	b1[n-k-1]=0;
	//b2成为后序右子树
	strncpy(b2,b+n-k-1,k);
	b2[k]=0;
	
	//左子树处理
	if(strlen(a1)!=0)
	{
		tree1->l=new Tree();
		px(tree1->l,a1,b1);
	}
	//右子树处理
	if(strlen(a2)!=0)
	{
		tree1->r=new Tree();
		px(tree1->r,a2,b2);
	}
}
//输出前序二叉树
void sc(Tree *tree1)
{
	cout<<tree1->v;
	if(tree1->l!=nullptr)
	{
		sc(tree1->l);
	}
	if(tree1->r!=nullptr)
	{
		sc(tree1->r);
	}
}
int main()
{
	char a[1000],b[1000];
	cin>>a>>b;
	tree=new Tree();
	px(tree,a,b);
	sc(tree);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值