剑指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张^_^). ...
随机推荐
- PHP : 数据库中int类型保存时间并通过年月份时分秒进行显示
1.表设计: 2.数据库操作页面:将时间戳插入到数据库中 我们到数据库中可以看到: 3.我们将数据进行显示: 页面结果:(二维数组) 4.以为用mysqli_fetch_all得到的是二维数组,那么我 ...
- redis网络模型
多路IO复用-非阻塞同步IO模型.见http://www.cnblogs.com/syyong/p/6231326.html 具体结构:http://blog.jobbole.com/100079/ ...
- php一个类引用另一个类的方法的写法
default.php: <?php namespace SiteInfo{ class Site{ var $url; var $title; function setUrl($par){ $ ...
- 使用Python命令创建jenkins的job
目的:通过调用jenkins的命令,动态创建jenkins的job 如何使用,使用Python的脚本,更多API可以进入到官网去查看,http://jenkinsapi.readthedocs.io/ ...
- 【CCPC-Wannafly Winter Camp Day4 (Div1) D】欧拉回路(分类讨论)
点此看题面 大致题意: 有一个\(n\)行\(m\)列的网格图,让你给每一条边设置一个通过次数(\(\ge1\)),使其成为欧拉回路,且通过次数总和最小. 初始化 首先,由于通过次数\(\ge1\), ...
- 2018年第九届蓝桥杯【C++省赛B组】第四题 测试次数
x星球的居民脾气不太好,但好在他们生气的时候唯一的异常举动是:摔手机.各大厂商也就纷纷推出各种耐摔型手机.x星球的质监局规定了手机必须经过耐摔测试,并且评定出一个耐摔指数来,之后才允许上市流通.x星球 ...
- bootstrap中模态框、模态框的属性
工作中有需要用到模态框的可以看看 <div class="modal fade" id="userModal" tabindex="-1&quo ...
- java的四个元注解 @Retention @Target @Document @Inherited
1. @Retention :注解的保留位置 @Retention(RetentionPolicy.SOURCE) //注解仅存在于源码中,在class字节码文件中不包含 @Retention( ...
- Tomcat8.0.36安装配置
1.下载tomcat8.0.36 下载地址:http://tomcat.apache.org/download-80.cgi 2.解压 至C:\Program Files\tomcat8下 3.添加系 ...
- 【PC-x86-x64】JDK 32bit与64bit的区别及x64 PC的发展历程【转】
一次偶然分析的机会: 在进行Minecraft也就是所谓的我的世界游戏的时候,在对局域网进行开放的时候,我的是64bit的JDK,而我同学的是32bit的JDK,所以在进行局域网链接的时候就会出现In ...