二叉树由后序,中序求先序

#include<stdio.h>
#include<algorithm>
#define MAX 10005

int cmp(const void *a , const void *b)
{
	return *(int *)a-*(int *)b ;
}
int s[MAX] , k , n , las[MAX] , mid[MAX] ,idx;
bool tag ;
int Findpos(int begin , int end , int cnt )
{
	for(int i = begin ; i <= end ; i ++)
		if(cnt == mid[i])
			return i ;
	return -1;
}
void Preorder(int lb , int le ,int mb , int me )
{
	if(le < lb || me < mb)
		return ;
	if(me == mb )
	{
		s[k++] = mid[me] ;
		return ;
	}
	int pos = Findpos(mb , me , las[le] );
	s[k++] = las[le] ;
	if(pos<0)
		tag = true ;
	if(tag)
		return ;
	Preorder(lb , lb-mb+pos-1 , mb , pos-1 );
	Preorder(lb-mb+pos , le - 1 , pos + 1 , me );
}

int main(void)
{
	while(scanf("%d",&n)!=EOF)
	{
		tag = false ;
		k = 0 ;
		int i  ;
		for( i = 1 ; i <= n ; i ++)
		{
			scanf("%d",&las[i]);
			mid[i] = las[i] ;
		}
		qsort(mid,n +  1,sizeof(mid[1]),cmp) ;
		Preorder(1 , n  , 1 , n  );
		if(tag)
			printf("No\n");
		else
					printf("Yes\n");
		for(i = 0 ; i < n ;  i ++)
			printf("%d ",s[i]);
		printf("\n");
	}
	return 0 ;
}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值