您的位置:首页 > 编程语言 > C语言/C++

生活的烦恼

2015-05-14 12:08 260 查看
生活的烦恼

时间限制: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

提示

5 第一层

/ \

7 4 第二层

/

3 第三层

如果对题意还有不理解或其他问题,请到讨论区提问或邮件我

#include<iostream>
#include <cstdio>
using namespace std;
char t[2];
int n,top=1;
char str[10010000];
struct S
{
char a;
S* l;
S* r;
}*p;
void cstruct(S*& k)
{
scanf("%s",&t);
if(t[0]=='@')return;
if(t[0]=='#')
{
k=NULL;
}
else
{
k=new S;
if(!k)return;
k->a=t[0];
cstruct(k->l);
cstruct(k->r);
}
}
void show(int f,S* k)
{
if(k==NULL)return;
if(f==n)
{
if(top==1)
{
printf("%c",k->a);
top++;
}
else
{
printf("~%c",k->a);
}
return;
}
show(f+1,k->l);
show(f+1,k->r);
}
//void root(S* p)
//{
//  if(p)
//  {
//      printf("%c ",p->a);
//      root(p->l);
//      root(p->r);
//  }
//  return;
//}
int main()
{
char t[10];
int N;
scanf("%d",&N);
while(N--)
{
p=NULL;top=1;
cstruct(p);
scanf("%s",&t);//这里有可能还有字符串会影响后面n的输入
scanf("%d",&n);
show(1,p);
printf("\n");
/*  root(p);
printf("\n");*/
}
return 0;
}


标程:

#include <stdio.h>
#include <string.h>
#define Max 16
char str[Max];
int t,num,temp[Max],sum[Max];
char map[Max][Max][Max];
int main(){
//freopen("in.txt","r",stdin);
scanf("%d",&t);
while(t--){
memset(temp,0,sizeof(temp));
memset(sum,0,sizeof(sum));
int count=0;
while(scanf("%s",str)&&str[0]!='@'){
count++;
temp[count-1]++;
if(str[0]=='#'){
count--;
while((temp[count]&1)==0)
count--;
}
else
strcpy(map[count][sum[count]++],str);
}
scanf("%d",&num);
for(int i=0;i<sum[num];i++){
printf("%s",map[num][i]);
printf("%s",i!=sum[num]-1?"~":"\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二叉树 c++