首先介绍下二叉树的层次遍历即按照顺序对树节点依次访问,如下图:

顺序遍历的结果为:ABCDEFGHIJK

我们可以借助一个队列来实现二叉树的层次遍历;思路如下:

先将二叉树根节点入队,然后出队,访问该节点,如果有左子树,则将左子树根节点入队;如果有右子树,则将右子树根节点入队。然后出队,对出队节点访问,如此循环

直到队列为空。

代码实现:


//
// Created by Administrator on 2018/6/5.
//
/*** 层次遍历:通过辅助队列实现二叉树的层次遍历*/
#include "stdio.h"
#include "stdlib.h"/*** 定义一棵树*/
typedef struct {char data;struct BitTreeNode *lchild, *rchild;
} BitTreeNode, *BitTree;/*** 定义一个队列节点*/
typedef struct {BitTree data;//节点元素struct QNode *next;//节点指向下一个节点的指针域
} QNode;/*** 定义一个队列:链式队列*/
typedef struct {//队列的头指针,尾指针:头指针始终指向头节点,尾指针随着元素入队向后移动// 如果队列为空则头指针=尾指针同时指向头节点QNode *front, *rear;
} LinkQueue;/*** 前序法创建树* @param tree* @return*/
BitTree createTree(BitTree tree) {char c;scanf("%c", &c);if (c == '#') {return 0;} else {tree = (BitTree) malloc(sizeof(BitTreeNode));tree->data = c;tree->lchild = createTree(tree->lchild);tree->rchild = createTree(tree->rchild);}return tree;
}/*** 初始化队列* @param q*/
void initQueue(LinkQueue *q) {q->front = q->rear = (QNode *) malloc(sizeof(QNode));q->front->next = NULL;
}/*** 入队操作* @param q* @param tree*/
void enQueue(LinkQueue *q, BitTree tree) {//开辟节点空间QNode *s = (QNode *) malloc(sizeof(QNode));//节点数据域赋值s->data = tree;//队列尾指针的指针域指向该节点q->rear->next = s;//队列尾指针移动到该节点q->rear = s;
}/*** 出队操作* @param q* @return*/
BitTree deQueue(LinkQueue *q) {//获取头结点的下一个节点QNode *s = q->front->next;//获取数据元素BitTree tree = s->data;//队列头指针的指针域指向出队节点的下一个节点q->front->next = s->next;if (s == q->rear) {//如果出队节点为队列尾指针,则说明该节点为队列的最后一个元素节点//将尾指针指向头指针(头指针指向了头结点)q->rear = q->front;}free(s);return tree;
}void visit(char data) {printf("%c", data);
}/*** 二叉树层次遍历* @param tree* @param queue*/
void levelOrder(BitTree tree, LinkQueue queue) {initQueue(&queue);BitTree p;enQueue(&queue, tree);while (queue.front != queue.rear) {p = deQueue(&queue);visit(p->data);if (p->lchild != NULL) {enQueue(&queue, p->lchild);}if (p->rchild != NULL) {enQueue(&queue, p->rchild);}}
}int main() {LinkQueue queue;BitTree tree;tree = createTree(tree);printf("层次遍历结果:\n");levelOrder(tree, queue);return 0;
}

数据结构-二叉树层次遍历相关推荐

  1. (数据结构)二叉树层次遍历

    二叉树层次遍历 二叉树层次遍历的实现思想是:通过队列数据结构,从树的根结点开始,依次将其左孩子和右孩子入队:而后每次队列中一个结点出队,都将其左孩子和右孩子入队,直到树中所有结点都出队,出队结点的先后 ...

  2. 二叉树层次遍历:队列

    二叉树层次遍历 二叉树层次遍历的基本算法在本文中不提及.本文内容为,在二叉树层次遍历中,为何选用队列这样一种数据结构. 不使用额外数据结构 首先,假设我们不使用额外的数据结构,只使用 1 个指针: 访 ...

  3. [LeetCode] Binary Tree Level Order Traversal 二叉树层次遍历(DFS | BFS)

    目录: 1.Binary Tree Level Order Traversal - 二叉树层次遍历 BFS 2.Binary Tree Level Order Traversal II - 二叉树层次 ...

  4. 二叉树层次遍历--广度遍历和深度遍历

    问题来源:二叉树层次遍历 问题描述:给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例子: 给定二叉树: [3,9,20,null,null,15,7], 3/ \9 ...

  5. 由序列确定二叉树:前序序列和中序序列构造二叉树 后序序列和中序序列构造二叉树 层次遍历序列和中序遍历序列构造二叉树 代码实现(c语言)

    下面三种序列可以唯一的构造唯一的一棵二叉树: 前序序列和中序序列构造二叉树 后序序列和中序序列构造二叉树 层次遍历序列和中序遍历序列构造二叉树 #include<stdio.h> #inc ...

  6. 第五期 C/C++数据结构 二叉树的遍历以及结点数、深度

    代码详见后面 实验三 树和二叉树 一.实验目的 1.使学生熟练掌握二叉树的逻辑结构和存储结构(重点). 2.熟练掌握二叉树的各种遍历算法(难点). 二.实验原理及说明 1. 前序遍历算法思想: (1) ...

  7. 树(二叉树层次遍历输出及二叉树前序遍历输入)

    前两篇解释了二叉树的有关逻辑概念及前中后序输出递归代码的实现,这篇将讲述二叉树层次遍历输出如何实现以及二叉树前序遍历输入的两种情况. 定义结构体 struct BiNode{char data;BiN ...

  8. 二叉树的层次遍历_【腾讯面试热身题】二叉树层次遍历(动画展示)

    二叉树的层次遍历同时涉及到树和队列两种数据结构的操作,因此大厂很喜欢用来作为面试的热身题.作者不少去腾讯的小伙伴,都反映,这种题一定要非常熟练,不然会被直接pass. 1 题目描述 给定一个二叉树,按 ...

  9. 二叉树层次遍历c语言_每日一道 LeetCode (23):二叉树的层次遍历 II

    ❝ 每天 3 分钟,走上算法的逆袭之路. ❞ 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub:https://github.com/meteor1993/LeetCode Gi ...

最新文章

  1. 《嵌入式系统开发之道——菜鸟成长日志与项目经理的私房菜》——02-08项目人力资源(Human Resource)管理...
  2. 苹果服务器修改主目录就打不开,苹果应用商店又挂了 App Store打不开怎么修复...
  3. 六种方法实现CSS三栏布局
  4. Android之SimpleAdapter使用
  5. RHEL/CENTOS 性能优化
  6. php个人扫码支付,PHP个人发卡网源码,支持MA支付对接,扫码自动发货
  7. linux下的缓存机制及清理buffer/cache/swap的方法梳理
  8. UI设计素材帮手, 排版技巧设计师
  9. 手工卡纸做机器人_亲子手工,带孩子用彩色卡纸做一朵可爱的小花,有教程
  10. 相关矩阵的可视化及其新方法探究
  11. Spring Boot 启动参数设置详解
  12. Java IO流学习总结一:输入输出流
  13. webservice接口开发经历
  14. oracle 时间段加减,ORACLE 时间加减操作
  15. Jetpack新成员,App Startup一篇就懂
  16. Mac上进行session hijack
  17. 富爸爸系列2—财务自由之路
  18. 用windows系统下的DOS命令将腾讯视频客户端下载的qlv文件转换成MP4格式(图文详解)
  19. 对于手写签名生成图片储存和回显的实现
  20. 厉害!「标题党」文章都能用 Python 分析出来

热门文章

  1. oracle级联删除表空间,Oracle表的创建.表空间创建删除,导入导出等
  2. 能使曲线变平滑的一维滤波器_双边滤波器的原理及实现
  3. 软件工程—让软件包自带commit id
  4. 阿里技术高P访谈之张俭恭:情义是阿里与外企的最大不同
  5. Visual C++中的异常处理浅析(上)
  6. 使用apache CXF和maven开发Web Service
  7. java 队列复制_java - 复制堆栈或队列,而无需使用“克隆” - 堆栈内存溢出
  8. 网页中设定表格边框的厚度的属性_网页试题
  9. sap 分摊分配不产生会计凭证的原因_MM 物料凭证没有产生相应的会计凭证...
  10. free mybatis 不生效_2019BATJ面试题汇总详解:MyBatis+MySQL+Spring+Redis+多线程