剑指OFFER之从上往下打印二叉树(九度OJ1523)
时间:2022-04-22
本文章向大家介绍剑指OFFER之从上往下打印二叉树(九度OJ1523),主要内容包括题目描述:、解题思路:、全部代码:、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
题目描述:
从上往下打印出二叉树的每个节点,同层节点从左至右打印。
输入:
输入可能包含多个测试样例,输入以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
解题思路:
很经典的广度优先算法,没什么说的了。
算法思想:
1 扫描最顶层的树节点,把它的孩子节点放入队列。
2 每次扫描队列队头节点,仍把它的孩子加入到队中,并按照先左孩子,再右孩子的顺序,这样保证一层的左右顺序。
3 直到队列为空。
//main()中的代码
findTree(a,n,1);
while(begin_q != end_q){
findTree(a,n,Quene[begin_q++]);
}
//扫描函数
void findTree(treeArr *a,int n,int j){
if(j<=n){
result[top_result++]=a->arr[j].num;
}
if(a->arr[j].lchild != 0){
Quene[end_q++] = a->arr[j].lchild;
}
if(a->arr[j].rchild != 0){
Quene[end_q++] = a->arr[j].rchild;
}
}
全部代码:
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#define MAXSIZE 1005
typedef struct treenode{
int num;
int lchild;
int rchild;
}Tree;
typedef struct treearr{
struct treenode arr[MAXSIZE];
}treeArr;
int Quene[MAXSIZE]={0};
int begin_q,end_q;
int result[MAXSIZE]={0};
int top_result;
void findTree(treeArr *a,int n,int j);
int main(){
int n,i;
char c;
int n1,n2;
while(scanf("%d",&n)!=EOF && n>=1 && n<=1000){
treeArr *a = (treeArr *)malloc(sizeof(treeArr));
memset(&Quene,0,sizeof(int)*MAXSIZE);
memset(&result,0,sizeof(int)*MAXSIZE);
begin_q=0;
end_q = 0;
top_result = 0;
for(i=0;i<MAXSIZE;i++){
a->arr[i].num = 0;
a->arr[i].lchild = 0;
a->arr[i].rchild = 0;
}
for(i=1;i<=n;i++){
scanf("%d",&a->arr[i].num);
}
for(i=1;i<=n;i++){
scanf("n%c",&c);
if(c == 'd'){
scanf("%d %d",&n1,&n2);
a->arr[i].lchild = n1;
a->arr[i].rchild = n2;
}else if(c == 'l'){
scanf("%d",&n1);
a->arr[i].lchild = n1;
}else if(c == 'r'){
scanf("%d",&n1);
a->arr[i].rchild = n1;
}else{
}
}
findTree(a,n,1);
while(begin_q != end_q){
//printf("findtree --- begin_q %d end_q %dn",begin_q,end_q );
findTree(a,n,Quene[begin_q++]);
}
for(i=0;i<n-1;i++){
printf("%d ", result[i]);
}
printf("%dn", result[n-1]);
}
return 0;
}
void findTree(treeArr *a,int n,int j){
if(j<=n){
result[top_result++]=a->arr[j].num;
}
if(a->arr[j].lchild != 0){
Quene[end_q++] = a->arr[j].lchild;
}
if(a->arr[j].rchild != 0){
Quene[end_q++] = a->arr[j].rchild;
}
}
/**************************************************************
Problem: 1523
User: xhalo
Language: C
Result: Accepted
Time:0 ms
Memory:920 kb
****************************************************************/
- 【答疑解惑】Java中的默认构造器和equals方法
- 原生JS | 当兔子遇到鸡
- 【Android基础】Activity的生命周期函数
- 七种常用回归技术,如何正确选择回归模型?
- 爬取拉勾网大数据相关岗位薪资信息存到excel,并作数据分析
- 【Windows编程】系列第五篇:GDI图形绘制
- 抓取链家官网北京房产信息并用python进行数据挖掘
- 用R语言做钻石价格预测
- 2分钟完成30*15页拉勾网职位需求关键词的抓取
- 【专业技术】Linux设备驱动第七篇:高级字符驱动操作之阻塞IO
- Python抓取上海各地区房价平均值
- R语言分析 老九门 到底谁是主角
- 【编程基础】C语言位
- 【专业技术】Android数据保存之文件保存
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux paste命令的使用方法
- ubuntu下迁移home目录至新的分区教程详解
- SVN服务备份操作步骤分享
- Linux磁盘挂载、分区、扩容操作的实现方法
- linux使用docker-compose部署软件配置详解
- 在Ubuntu中如何查看网络路由表详解
- linux中各种锁机制的使用与区别详解
- Linux环境下使用glog日志库的方法
- crontab执行时间与系统时间不一致问题解决
- Linux内核设备驱动之proc文件系统笔记整理
- CentOS7.6系统下使用yum配置lnmp环境的方法
- Linux内核设备驱动之高级字符设备驱动笔记整理
- Linux使用scp命令进行文件远程拷贝详解
- Linux内核设备驱动之Linux内核模块加载机制笔记整理
- linux无损扩容的方法