您的位置:首页 > 其它

九度 题目1523:从上往下打印二叉树

2014-05-21 13:00 253 查看
题目来源:http://ac.jobdu.com/problem.php?pid=1523

时间限制:1 秒

内存限制:128 兆

特殊判题:否

提交:614

解决:254

题目描述:

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

输入:

输入可能包含多个测试样例,输入以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


分析:

自上而下,自左而右打印二叉树,乍一看,真不好处理。事实上,以根节点为例,打印根节点之后,就要打印它的左子节点和右子节点(假设根节点的两个左右子节点都存在),是不是非常像对二叉树进行一遍广度优先搜索,事实上他就是!因此广搜一下就出来了!

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>

using namespace std;

const int MAXN = 1010;

struct Binary_Node
{
int iData;
Binary_Node* pLChild;
Binary_Node* pRChild;
Binary_Node()
{
iData = 0;
pLChild = pRChild = NULL;
}
};

Binary_Node* Binary_Tree[MAXN];

queue <Binary_Node*> Q;

void Print_Binary_Tree_InLevel(Binary_Node* pRoot)
{
while(!Q.empty())
Q.pop();
int arr[MAXN], iPos = 0;//arr中存放的是广搜搜索到的数,因为最后一个数据之后没有空格,因此需要找个中间变量来储存
if(pRoot == NULL)
return ;
Binary_Node* tmp;
Q.push(pRoot);
while(!Q.empty())
{
tmp = Q.front();
Q.pop();
arr[iPos++] = tmp->iData;
if(tmp->pLChild != NULL)
Q.push(tmp->pLChild);
if(tmp->pRChild != NULL)
Q.push(tmp->pRChild);
}
cout<<arr[0];
for(int i = 1; i < iPos; ++i)
cout<<" "<<arr[i];
cout<<endl;
}

void Delete_BinaryTree(int n)
{
int i;
for(i = 0; i <= n; ++i)
delete Binary_Tree[i];
}

int main()
{
int n, i, a, b;
char c;
while(cin>>n)
{
for(i = 0; i <= n; ++i)
Binary_Tree[i] = new Binary_Node();
for(i = 1; i <= n; ++i)
cin>>Binary_Tree[i]->iData;
for(i = 1; i <= n; ++i)
{
cin>>c;
if(c == 'd')
{
cin>>a>>b;
Binary_Tree[i]->pLChild = Binary_Tree[a];
Binary_Tree[i]->pRChild = Binary_Tree[b];
}
else if(c == 'l')
{
cin>>a;
Binary_Tree[i]->pLChild = Binary_Tree[a];
}
else if(c == 'r')
{
cin>>a;
Binary_Tree[i]->pRChild = Binary_Tree[a];
}
}
Print_Binary_Tree_InLevel(Binary_Tree[1]);
Delete_BinaryTree(n);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: