- 题目描述:
-
从上往下打印出二叉树的每个节点,同层节点从左至右打印。
- 输入:
-
输入可能包含多个测试样例,输入以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
【解题思路】这道题目应该一眼就看看出是树的层序遍历,看出来之后也就没有什么可以说的了。注意首先用一定的数据结构保存树,然后利用set数据结构寻找出根节点。然后就是利用队列进行层序遍历。
AC code:
#include <cstdio> #include <vector> #include <set> #include <queue> using namespace std; struct tr { int val,lc,rc; }; int main() { int n,r,l; char cc[2]; while(scanf("%d",&n)!=EOF) { tr rt; rt.lc=rt.rc=0; vector<tr> vect(n+1); set<int> setidx; queue<int> qu; for(int i=1;i<=n;++i) { scanf("%d",&rt.val); vect[i]=rt; setidx.insert(i); } for(int i=1;i<=n;++i) { scanf("%s",cc); switch(cc[0]){ case 'd': scanf("%d%d",&l,&r); vect[i].lc=l; vect[i].rc=r; setidx.erase(l); setidx.erase(r); break; case 'l': scanf("%d",&l); vect[i].lc=l; setidx.erase(l); break; case 'r': scanf("%d",&r); vect[i].rc=r; setidx.erase(r); break; case 'z': break; default: break; } } printf("%d",vect[*setidx.begin()].val); if(vect[*setidx.begin()].lc!=0) qu.push(vect[*setidx.begin()].lc); if(vect[*setidx.begin()].rc!=0) qu.push(vect[*setidx.begin()].rc); while(!qu.empty()) { int ft=qu.front(); printf(" %d",vect[ft].val); if(vect[ft].lc!=0) qu.push(vect[ft].lc); if(vect[ft].rc!=0) qu.push(vect[ft].rc); qu.pop(); } printf(" "); } return 0; } /************************************************************** Problem: 1523 User: huo_yao Language: C++ Result: Accepted Time:0 ms Memory:1056 kb ****************************************************************/题目链接:http://ac.jobdu.com/problem.php?pid=1523九度-剑指Offer习题全套答案下载:http://download.csdn.net/detail/huoyaotl123/8276299