二叉树的层次遍历详解(C语言版)
什么是层次遍历呢?
按照我的理解,层次遍历就是从上到下,从左往右,一层层的遍历
如下图,层次遍历的结果是:ABCDEF
图片来源于https://blog.csdn.net/hansionz/article/details/81947834
算法思想
先定义一个循环队列,使这个队中的数据域能存放二叉树中的元素。元素入队后,就输出队头元素的值,然后让队头元素出队,并将其的左右孩子依次入队…周而复始地进行同样的操作,直到队为空。最终,出队的顺序就是层次遍历的顺序。
听完是不是还是有点蒙?没事,我们来看核心代码帮助理解
核心代码
void Leave (BT* t)
{LinkQueue Q;
//定义一个循环队列 Q.head = 0;Q.rear = 0;
//循环队列初始化
//队为空的条件:队头等于队尾 BT* temp;
//定义一个二叉树类型的指针 PushQueue (&Q, *t);
//根节点入队while (EmptyQueue (&Q))
//当队不为空时,循环 {*temp = Q.data[Q.head+1];
//将队头元素赋值给变量*temp printf ("%c", temp->data);
//输出队头元素的值 PopQueue (&Q);
//队头元素出队 if (temp->lchild != NULL)
//如果左孩子不为空,则左子树入队 {PushQueue (&Q, *temp->lchild);}
//如果右孩子不为空,则右子树入队 if (temp->rchild != NULL){PushQueue (&Q, *temp->rchild);} }
}
测试代码
以图片中的字母为二叉树的元素,则运行结果应该为ABCDEF
# include <stdio.h>
# include <malloc.h>
# define MAX 100
//定义数组的长度为100 //二叉树的结点定义
typedef struct node
{struct node *lchild, *rchild;char data;
}BT;//循环队列的结点定义
typedef struct
{int head;
//head为头 int rear;
//rear为尾 BT data[MAX];
//data为二叉树类型的数组,能存放二叉树中的元素
}LinkQueue;//创建一个二叉树
BT* CreateTree ()
{BT* t;char ch;scanf ("%c", &ch); getchar (); if (ch == '#'){t = NULL;}else{t = (BT*) malloc (sizeof (BT));t->data = ch;printf ("请输入%c的左子树:", t->data);t->lchild = CreateTree ();printf ("请输入%c的右子树:", t->data);t->rchild = CreateTree();}return t;
} //判断队是否为空
//队不为空则返回1,队空则返回0
int EmptyQueue (LinkQueue* Q)
{if (Q->head == Q->rear){return 0;}else{return 1;}
} //入队
void PushQueue (LinkQueue* Q, BT t)
{Q->rear = (Q->rear+1)%MAX;Q->data[Q->rear] = t;
} //出队
void PopQueue (LinkQueue* Q)
{Q->head = (Q->head+1)%MAX;
} //层次遍历二叉树
void Leave (BT* t)
{LinkQueue Q;
//定义一个循环队列 Q.head = 0;Q.rear = 0;
//循环队列初始化
//队为空的条件:队头等于队尾 BT* temp;
//定义一个二叉树类型的指针 PushQueue (&Q, *t);
//根节点入队while (EmptyQueue (&Q))
//当队不为空时,循环 {*temp = Q.data[Q.head+1];
//将队头元素赋值给变量*temp printf ("%c", temp->data);
//输出队头元素的值 PopQueue (&Q);
//队头元素出队 if (temp->lchild != NULL)
//如果左孩子不为空,则左子树入队 {PushQueue (&Q, *temp->lchild);}
//如果右孩子不为空,则右子树入队 if (temp->rchild != NULL){PushQueue (&Q, *temp->rchild);} }
}int main (void)
{BT* t;printf ("请按先序依次输入树的结点!!!\n"); printf ("请输入根节点:"); t = CreateTree (); Leave (t); return 0;
}
运行结果
注意:#表示空的意思
二叉树的层次遍历详解(C语言版)相关推荐
- 数据结构殷人昆电子版百度云资源_数据结构精讲与习题详解(C语言版第2版清华大学计算机系列教材)...
导语 内容提要 殷人昆编著的<数据结构精讲与习题详解(C语言版第2版清华大学计算机系列教材)>是清华大学出版社出版的<数据结构(C语言版)>(第2版)的配套教材,对" ...
- 二叉树的非递归遍历和层次遍历详解
二叉树非递归遍历非递归的后序遍历二叉树 //非递归的后续遍历二叉树 void HXprint(Tree *tree){Stack s = initStack(); //初始化一个下面使用的栈 tree ...
- 二叉树的递归遍历详解
首先理解二叉树的遍历递归方法.这篇文章写的不错. https://blog.csdn.net/allenchenhh133/article/details/80291252 看完这篇文章后,再总结下: ...
- 【八大排序详解~C语言版】直接插入排序-希尔排序- 直接选择排序-堆排序-冒泡排序-快速排序-归并排序-计数排序
八大排序 1.直接插入排序 2.希尔排序 3.直接选择排序 直接选择排序改进 4.堆排序 1.建堆 2.利用堆删除思想来进行排序 5.冒泡排序 6.快速排序 递归实现 非递归实现 7.归并排序 递归实 ...
- 二叉树层次遍历算法 python_二叉树的遍历详解:前、中、后、层次遍历(Python实现)...
二叉树的遍历详解:前.中.后.层次遍历(Python实现) 二叉树是一种常见的数据结构,而它的常见遍历方法有前序遍历.中序遍历.后续遍历.层次遍历--掌握这几种遍历方法是很有必要的. 假设我们二叉树节 ...
- 二叉树前中后序遍历的非递归实现以及层次遍历、zig-zag型遍历详解
前言 二叉树的遍历是一个比较常见的问题,递归实现二叉树的前中后序遍历比较简单,但非递归实现二叉树的前中后序遍历相对有难度.这篇博客将详述如何使用非递归的方式实现二叉树的前中后序遍历,在进行理论描述的同 ...
- 二叉树层次遍历c语言_每日一道 LeetCode (23):二叉树的层次遍历 II
❝ 每天 3 分钟,走上算法的逆袭之路. ❞ 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub:https://github.com/meteor1993/LeetCode Gi ...
- 图遍历详解(C语言版)
文章目录 一.定义 二.方法 1.深度优先遍历 2.广度优先遍历 三.实现 1.无向图或强连通有向图遍历 2.非连通图遍历 结语 附录 一.定义 从给定图中任意指定的顶点(称为初始点)出发,按照某种搜 ...
- #转载:杨辉三角形实现过程详解-c语言基础
杨辉三角形实现过程详解-C语言基础 十一一个人 2018-12-26 06:45:45 6465 收藏 28 最后发布:2018-12-26 06:45:45首发:2018-12-26 06:45:4 ...
最新文章
- C语言strcpy,strncpy和strlcpy讲解
- 创业路上有指引,永洪CEO给企业服务型创业公司的融资建议
- 关于创建SWAP示例
- 前端学习(3332):ant design介绍button
- 40 SD配置-销售凭证设置-分配计划行类别
- 通过JDK动态代理实现拦截器
- 2.策略模式(Strategy)
- C++从屏幕输入数字以空格分割,存入整型数组
- AlphaGo Zero算法讲解
- 服务器两块硬盘怎么合并,Windows2008磁盘合并和分区教程
- 达叔的游戏框架(二) 得到其他模块的方式
- 德鲁克谈《自我管理》——《哈佛商业评论》史上最受欢迎的文章
- php如何配置gii,深入浅析yii2-gii自定义模板的方法
- centos7安装或升级Google chrome、安装Firefox浏览器详细过程及设置桌面快捷方式
- 狼与狗的本质区别:从打工到老板的突破
- 非官方新人参考之quake3入门碎解
- Word-embeding 【paper】
- 微信小程序引入原生组件——WeUI组件库,详细步骤
- swift之网络请求框架Alamofire
- BAT54肖特基二极管;引脚配置 BAV99 串联二极管规格
热门文章
- 关于springboot转发重定向以及受保护目录的一些规律
- CustomValidator 控件
- QPCore Service 是什么?是否可以禁用?如何彻底删除它?
- 电脑合上盖子不锁屏_笔记本合上盖子不锁屏
- Web3的“陨落”,西下与东升
- JavaScript常用数组操作方法
- HJ1 字符串最后一个单词的长度
- 双十一值得入手的运动耳机有哪些?值得推荐的六款热门运动耳机
- JAVA中如何使用IDEA实现反编译(图片详解)
- 【往事清零,未来可期】研究生入学前的50天,我干了什么“见不得人”的勾当...