二叉树 poj1577

真的说,有的时候思路是很重要的,坐这道题的时候一直钻进死胡同里面,然后一直出不来,所幸我就几天没有看,然后今天又再次看了一下,一想竟然出来了,有的时候真的需要一点灵感的啊!

#include<iostream>//空树海没有考虑呢!
#include<cstring>
using namespace std;
typedef struct fun
{
	int stage,l,r;
}rr;
fun a[30];
void found(int root,int r)//老是当作递归来写的啊!
{ 
	 int i,rt,k;
	 for(k=r; k>=1; k--)
	 {
		 for(i=0; i<26; i++)
		 {
			 if(a[i].stage==k)
			 {
				 rt=root;
				 while(1)//不断的循环找到那个位置的
				 {
					 if(i<rt)
					 {
						 if(a[rt].l==-1)
						 {
							 a[rt].l=i;
							 break;
						 }
						 else
							 rt=a[rt].l;
					 }
					 else
					 {
						 if(a[rt].r==-1)
						 {
							 a[rt].r=i;
							 break;
						 }
						 else
							 rt=a[rt].r;
					 }
				 }
			 }
		 }
	 }
}
void vis(int k)
{
	printf("%c",k+65);
	if(a[k].l!=-1)
		vis(a[k].l);
	if(a[k].r!=-1)
		vis(a[k].r);
}
int main()
{
	int i,k=0;
	char s[30];
	while(1)
	{
		scanf("%s",s);
		int len=strlen(s);
		if(len==1 && (s[0]=='*'|| s[0]=='$'))
		{
			for(i=0; i<26; i++)
				if(a[i].stage==k)//找到根所在的地方的
					break;
		    if(i!=26)//判断是否是空树的,因为这个可能是临街的情况的
			{ 
			    found(i,k-1);
			    vis(i);
				printf("\n");
			}
			if(s[0]=='*')//判断是新一轮的开始,还是程序就要结束了
			{
				k=0;
				for(i=0; i<26; i++)
					a[i].stage=0;
			}
			else
				break;//结束啦!
		}
		else
		{
			++k;
			for(i=0; i<len; i++)//这个是输入字符串的长的得
			{
				a[s[i]-65].stage=k;//记录的是登记的
				a[s[i]-65].l=a[s[i]-65].r=-1;//做初始化的
			}
		}
	}
	return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

淡定的小Y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值