您的位置:首页 > 其它

考研机试题 九度oj 1523:从上往下打印二叉树

2013-11-27 22:08 183 查看
题目1523:从上往下打印二叉树

时间限制:1 秒

内存限制:128 兆

特殊判题:

提交:350

解决:145

题目描述:
从上往下打印出二叉树的每个节点,同层节点从左至右打印。

输入:
输入可能包含多个测试样例,输入以EOF结束。

对于每个测试案例,输入的第一行一个整数n(1<=n<=1000, :n代表将要输入的二叉树元素的个数(节点从1开始编号)。接下来一行有n个数字,代表第i个二叉树节点的元素的值。接下来有n行,每行有一个字母Ci。

Ci=’d’表示第i个节点有两子孩子,紧接着是左孩子编号和右孩子编号。

Ci=’l’表示第i个节点有一个左孩子,紧接着是左孩子的编号。

Ci=’r’表示第i个节点有一个右孩子,紧接着是右孩子的编号。

Ci=’z’表示第i个节点没有子孩子。

输出:
对应每个测试案例,

按照从上之下,从左至右打印出二叉树节点的值。

样例输入:
7
8 6 5 7 10 9 11
d 2 5
d 3 4
z
z
d 6 7
z
z

样例输出:
8 6 10 5 7 9 11

题目链接这道题本来很简单,可是自己感觉自己能力不够字符处理不好,换行符老是被吃掉,当输入一个字符,再输入一个十进制数的数,经常会出现会有换行符导致后面的%d输入会被吃掉,用getchar()时有时会出错,导致数字被吃掉所以wrong了很久,最后没办法cin解决了,所以以后要灵活多变,如果一个不能解决时要很快换一个别的方法;这道题思路很简单,关键是队列,再加上简单的广搜;每次找到顶点后就把它孩子入队;把该节点出队,这样就一层一层排列了,感觉这道题应该有更好的方法,我写的很麻烦;
#include<stdio.h>
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
struct point
{
int left;
int right;
int num;
char ch;
}a[1005];
int visit[1005];
queue<int> q;
int Visit()
{
int b,flag=0;
while(!q.empty())
{
b=q.front();
if(flag==0)
printf("%d",a[b].num);
else
printf(" %d",a[b].num);
flag=1;
q.pop();//该节点出队出队
if(a[b].ch=='d')
{
q.push(a[b].left);//节点孩子入队操作
q.push(a[b].right);
}
if(a[b].ch=='l')
{
q.push(a[b].left);
}
if(a[b].ch=='r')
{
q.push(a[b].right);

}
}
return 0;
}
int main()
{

int i,j,n,num;
char ch1;
while(scanf("%d",&n)!=EOF)
{
num=0;
for(i=1;i<=n;i++)
{
scanf("%d",&a[i].num);
}
//	fflush(stdin);在线oj不要用ff否则会错得很惨
for(i=1;i<=n;i++)
{
//这里错得很离谱,输入输出错误,getchar()很容易错
cin>>a[i].ch;
//	scanf("%c\n", &a[i].ch);
//	a[i].ch = getchar();
//	printf(" --%c", a[i].ch);
if(a[i].ch=='d')
{
scanf("%d%d",&a[i].left,&a[i].right);
//	getchar();
visit[a[i].left]++;
visit[a[i].right]++;
}
if(a[i].ch == 'z')
getchar();
if(a[i].ch=='l')
{
scanf("%d",&a[i].left);
//	getchar();
visit[a[i].left]++;
}
if(a[i].ch=='r')
{
scanf("%d",&a[i].right);
//	getchar();
visit[a[i].right]++;
}

//	fflush(stdin);
}
for(i=1;i<=n;i++)
{
if(visit[i]==0)
num=i;
}
q.push(num);
Visit();
cout<<endl;
}
return 0;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息