剑指Offer - 九度1523 - 从上往下打印二叉树
剑指Offer - 九度1523 - 从上往下打印二叉树
2013-12-01 00:35
- 题目描述:
 - 
从上往下打印出二叉树的每个节点,同层节点从左至右打印。
 
- 输入:
 - 
输入可能包含多个测试样例,输入以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
 
题意分析:
很典型的level-order traversal问题。当我们需要从上至下,从左至右遍历二叉树时,用队列是最好的办法了。思路如下:
1. 初始化时,将根节点push入队
2. 只要队列不为空,就pop出一个元素进行输出,并将这个元素的左右孩子(如果不为空)依次push进队。
3. 队列为空时,算法执行结束。
那么,怎么确定这个算法是对的呢?
首先是从上至下,对于每个节点,都将它的左右孩子入队,两者深度相差1。因此遍历出来的结果中,第n+1层的结果必然紧跟第n层之后。
然后是从左至右,对于每个节点,都是从左至右将子节点入队,所以对于同一层的结果顺序肯定是满足从左至右的。
说实话,写个能ac的代码不算什么大本事,能严格证明自己程序的正确性才是真牛人...或许我读完了《算法导论》后能给这篇文章补上个严格的推理过程。不得不感叹自己还是荒废太多时间了,大学四年都没读几本像样的书,已然二十三岁高龄,老大徒伤悲矣~一万小时却还连一半都没攒到,难怪水平这么菜了。
输入数据要注意:根节点是哪一个,题目并没指定,所以要根据入度来判断哪个才是根,根节点入度为0。
// 652502 zhuli19901106 1523 Accepted 点击此处查看所有case的执行结果 1052KB 1528B 0MS
//
#include <cstdio>
#include <queue>
using namespace std; int main()
{
const int MAXN = ;
queue<int> qq;
int i;
int n;
int x, y;
int r;
int a[MAXN][];
int c[MAXN];
bool first_node;
char s[]; while(scanf("%d", &n) == ){
for(i = ; i < n; ++i){
scanf("%d", &a[i][]);
c[i] = ;
}
for(i = ; i < n; ++i){
scanf("%s", s);
if(s[] == 'd'){
scanf("%d%d", &x, &y);
a[i][] = x - ;
a[i][] = y - ;
++c[x - ];
++c[y - ];
}else if(s[] == 'l'){
scanf("%d", &x);
a[i][] = x - ;
a[i][] = -;
++c[x - ];
}else if(s[] == 'r'){
scanf("%d", &y);
a[i][] = -;
a[i][] = y - ;
++c[y - ];
}else{
a[i][] = a[i][] = -;
}
} r = -;
for(i = ; i < n; ++i){
if(c[i] == ){
r = i;
break;
}
}
if(r < ){
// invalid tree structure
continue;
} first_node = true;
qq.push(r);
while(!qq.empty()){
x = qq.front();
qq.pop();
if(first_node){
printf("%d", a[x][]);
first_node = false;
}else{
printf(" %d", a[x][]);
}
if(a[x][] != -){
qq.push(a[x][]);
}
if(a[x][] != -){
qq.push(a[x][]);
}
}
printf("\n"); while(!qq.empty()){
qq.pop();
}
} return ;
}
剑指Offer - 九度1523 - 从上往下打印二叉树的更多相关文章
- 剑指Offer:面试题23——从上往下打印二叉树(java实现)
		
问题描述: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 思路: 按照层次遍历的方法,使用队列辅助. 1.将根结点加入队列. 2.循环出队,打印当前元素,若该结点有左子树,则将其加入队列,若 ...
 - 剑指offer(22)从上往下打印二叉树
		
题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 题目分析 从下打印就是按层次打印,其实也就是树的广度遍历. 一般来说树的广度遍历用队列,利用先进先出的特点来保存之前节点,并操作之前的 ...
 - 【剑指offer】不分行从上到下打印二叉树,C++实现(层序遍历)
		
原创文章,转载请注明出处! 本题牛客网地址 博客文章索引地址 博客文章中代码的github地址 1.题目 从上往下打印出二叉树的每个节点,同层节点从左至右打印.例如: 图 不分行从上往下按层打印二叉 ...
 - 【剑指Offer】22、从上往下打印二叉树
		
题目描述: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 解题思路: 本题实际上就是二叉树的层次遍历,深度遍历可以用递归或者栈,而层次遍历很明显应该使用队列.同样我们可以通过 ...
 - 剑指offer-面试题32-分行从上到下打印二叉树-二叉树遍历
		
/* 题目: 分行按层自上向下打印二叉树. */ /* 思路: 使用队列,将节点压入队列中,再弹出来,压入其左右子节点,循环,直到栈为空. 添加两个计数器,current记录当前行的节点数,next记 ...
 - 剑指offer_面试题_从上往下打印二叉树
		
题目:从上往下打印出二叉树的每一个结点.同一层的结点依照从左到右的顺序打印.比如输入图4.5中的二叉树.则依次打印出8.6.10.5.7.9.11. 8 / \ 6 10 / \ ...
 - 剑指Offer - 九度1504 - 把数组排成最小的数
		
剑指Offer - 九度1504 - 把数组排成最小的数2014-02-06 00:19 题目描述: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输 ...
 - 剑指Offer - 九度1360 - 乐透之猜数游戏
		
剑指Offer - 九度1360 - 乐透之猜数游戏2014-02-05 19:54 题目描述: 六一儿童节到了,YZ买了很多丰厚的礼品,准备奖励给JOBDU里辛劳的员工.为了增添一点趣味性,他还准备 ...
 - 剑指Offer - 九度1355 - 扑克牌顺子
		
剑指Offer - 九度1355 - 扑克牌顺子2014-01-30 23:19 题目描述: LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^). ...
 
随机推荐
- 【HDU4676】Sum Of Gcd(莫队+欧拉函数)
			
点此看题面 大致题意: 多组询问,求\(\sum_{i=L}^R\sum_{j=i+1}^Rgcd(i,j)\). 推式子 这道题我们可以考虑,每个因数\(d\)被统计答案的次数,肯定与其出现次数有关 ...
 - ZooKeeper 完全分布式集群环境搭建
			
1. 搭建前准备 示例共三台主机,主机IP映射信息如下: 192.168.32.101 s1 192.168.32.102 s2 192.168.32.103 s3 2.下载ZooKeeper, 以 ...
 - miller——rabin
			
突然发现自己在线性筛素数中有这个,忘了好久: #include<iostream> #include<cstdio> using namespace std; long lon ...
 - 【Java】对象、类(抽象类与内部类)、接口
			
博文内容概况 对象和类 抽象类 接口 内部类 对象和类 对象是对客观事物的抽象,类是对对象的抽象.类是一种数据类型,其外观和行为由用户定义.类中可以设置两种类型的元素:字段(有时被称为数据成员)和方法 ...
 - rest_framwork组件
			
rest framework介绍 (CBV(class base views)) 在开发REST API的视图中,虽然每个视图具体操作的数据不同,但增.删.改.查的实现流程基本套路化,所以这部分代码也 ...
 - 简单webservice实现(xFire1.2)
			
基于xfire实现webservice的实例 首先下载xfire的jar包,并导入项目当中 下载地址:http://xfire.codehaus.org/Download 编写实现类 首先建一个接口把 ...
 - 深入理解java虚拟机学习笔记(一)JVM内存模型
			
上周末搬家后,家里的宽带一直没弄好,跟电信客服反映了N遍了终于约了个师傅明天早上来迁移宽带,可以结束一个多星期没网的痛苦日子了.这段时间也是各种忙,都一个星期没更新博客了,再不写之前那种状态和激情都要 ...
 - zabbix服务端安装配置
			
1.安装好httpd,mysql,php yum install httpd php mysql mysql-devel php-xmlwriter php-gd php-mbstring php-b ...
 - MySQL运行一段时间后自动停止问题的排查
			
在进入主题前,一定要先吐槽下自己,前段时间购买了一台阿里云服务器,最开始打算只是自己个人用的,就买了一台配置很寒碜的服务器: CPU: 1核 内存: 1 GB 操作系统: CentOS 7.2 64位 ...
 - ES6笔记02-箭头函数
			
eg1:// ES5 匿名函数 var total = values.reduce(function (a, b) { return a + b; }, 0); // ES6 匿名函数 var tot ...