nyoj_1063生活的烦恼(二叉树)

生活的烦恼

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 2
描述

生活的暑假刚集训开始,他要决心学好字典树,二叉树,线段树和各种树,但生活在OJ上刷题的时候就遇到了一个特别烦恼的问题。那当然就是他最喜欢的二叉树咯!题目是这样的:给你一颗非空的二叉树,然后再给你一个整数n,让生活输出这颗二叉树的第n(n>0且n<=树的深度)层,出题者为了给生活降低难度,要求两个输出数据之间用'~'隔开。看来我们的出题人很有爱啊!


输入
第一行输入一个数N,表示有N组测试数据。接下来N行,每行一个字符串,用'#'表示为空的节点,树的结束标志为'@'。'@'后仅有一个空格,空格后为一个数字,表示生活要输出的二叉树的第几层!
输出
每行输出一个字符串,表示给出二叉树的第n层!
样例输入
2
1 2 # # 3 # # @ 1
5 7 3 # # # 4 # # @ 3
样例输出
1
3

这题就相当于一个二叉树的创建,之后输出第n层就好。

#include<stdio.h>
#include<math.h> 
char tree[1000];  
char str[1000];
int k;
void buildTree(int root)
{
	tree[root]=str[k];
	if(str[k]=='#')
		return ;
	k+=2;               //跳过空格 
	buildTree(root*2);   //创建左子树 
	k+=2;
	buildTree(root*2+1);  //创建右子树 
}
int main()
{
	int i,t,n,m,mark;
	scanf("%d",&t);
	getchar();
	while(t--)
	{
		k=0;
		mark=0;
		gets(str);
		buildTree(1);
		n=str[k+4]-'0';
		m=pow(2,n-1);
		for(i=m;i<m*2;i++)
		{
			if(tree[i]!='#'){
				if(mark==0) 
				{
					printf("%c",tree[i]);
					mark=1;
				}
				else
					printf("~%c",tree[i]);
			}	
		}
		printf("\n");
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值