剑指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张^_^). ...
随机推荐
- MyEclipse 相关配置操作、问题处理及快捷键说明
MyEclipse傻瓜式安装不做介绍,试用期结束后破解操作见博客:MyEclipse 2014 破解补丁及激活步骤 以下为安装完MyEclipse后一般需要进行的一些配置,写来自己参考用.比较简陋,望 ...
- JSON:使用json_encode函数解析结果为Null
1.首先,数据库中的json数据是这样的 2.仓鼠使用json_encode()函数进行解析json数据时,显示了一个NULL: 3.这时候,我们需要使用,表示在解析json之前,该json是有语法错 ...
- April 22 2017 Week 16 Saturday
Fear is an essential part of our survival, it keeps us alert. 恐惧是生存的重要部分,它让我们保持警惕. Fear and pain are ...
- python 字符串部分总结
字符串 对于单个字符的编码,Python提供了ord()函数获取字符的整数表示,chr()函数把编码转换为对应的字符 >>> ord('A') 65 >>> ord ...
- BZOJ 3235: [Ahoi2013]好方的蛇
BZOJ 3235: [Ahoi2013]好方的蛇 标签(空格分隔): OI-BZOJ OI-DP OI-容斥原理 Time Limit: 10 Sec Memory Limit: 64 MB Des ...
- clear:both;和overflow:hidden;的应用理解。
摘自cbwcwy 前辈: clear是子模块之间限定的,如下:<div id="a"> <div id="1"></div& ...
- Python中的__name__和__main__含义详解
1背景 在写Python代码和看Python代码时,我们常常可以看到这样的代码: ? 1 2 3 4 5 def main(): ...... if __name == "__m ...
- MySQL中的if和case语句使用总结
create table test( id int primary key auto_increment, name ), sex int ) ),(),(),() ,'男','女') from te ...
- Bootstarp学习教程(7) 表单
基本案例:“form-control”修饰的<input>.<textarea>和<select>元素都将被默认设置为width: 100%;表单控件包裹在&quo ...
- LeetCode(Add Two Numbers)
一.题目要求 You are given two non-empty linked lists representing two non-negative integers. The digits a ...