剑指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张^_^). ...
随机推荐
- C++ new new[]详解
精髓: operator new()完成的操作一般只是分配内存:而构造函数的调用(如果需要)是在new运算符中完成的. operator new和new 运算符是不同的,operator new只分配 ...
- CRM WebClient UI和Hybris里工作中心跳转的url生成逻辑
CRM WebClient UI 把Work center的navigation target在client side不可见:在Chrome development tool里看不到,而是点击了Wor ...
- *389. Find the Difference (string + map(26)) read problems carefully
Given two strings s and t which consist of only lowercase letters. String t is generated by random s ...
- MySQL一致性非锁定读
一致性非锁定读(consistent nonlocking read)是指InnoDB存储引擎通过多版本控制(multi versionning)的方式来读取当前执行时间数据库中行的数据,如果读取的行 ...
- 数据库连接-ADO.NET
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/huo065000/article/details/25830291 非常早就知道了ADO ...
- 2017.10.14 Java的流程控制语句switch&&随机点名器
今日内容介绍 1.流程控制语句switch 2.数组 3.随机点名器案例 ###01switch语句解构 * A:switch语句解构 * a:switch只能针对某个表达式的值作 ...
- EF 连接数据库 Mysql (database first ) 一个表对应一个模型
准备工作 1.下载vs2015 2.下载mysql2017 3.安装 1.创建数据库 2. 将数据库映射成模型 3创建aspx 文件. 写下窗体内容的代码 hello_worldEntities en ...
- Spring 注解中@Resource 和 @Authwired 的区别
@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了.@Resource有两个属性是比较重要的,分 ...
- 太阳地球月亮运行动画(使用@keyframes)
闲来无事的demo <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...
- expect配合shell 实现自动分发秘钥文件
expect使用场景 有时候需要批量地执行一些操作,或者执行自动化的操作的时候,有些指令需要交互式地进行这就会有很多麻烦,linux下有一个程序交expect,它可以模拟键盘输入文本,省去人工干预交互 ...