什么是层次遍历呢?

按照我的理解,层次遍历就是从上到下,从左往右,一层层的遍历
如下图,层次遍历的结果是: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语言版)相关推荐

  1. 数据结构殷人昆电子版百度云资源_数据结构精讲与习题详解(C语言版第2版清华大学计算机系列教材)...

    导语 内容提要 殷人昆编著的<数据结构精讲与习题详解(C语言版第2版清华大学计算机系列教材)>是清华大学出版社出版的<数据结构(C语言版)>(第2版)的配套教材,对" ...

  2. 二叉树的非递归遍历和层次遍历详解

    二叉树非递归遍历非递归的后序遍历二叉树 //非递归的后续遍历二叉树 void HXprint(Tree *tree){Stack s = initStack(); //初始化一个下面使用的栈 tree ...

  3. 二叉树的递归遍历详解

    首先理解二叉树的遍历递归方法.这篇文章写的不错. https://blog.csdn.net/allenchenhh133/article/details/80291252 看完这篇文章后,再总结下: ...

  4. 【八大排序详解~C语言版】直接插入排序-希尔排序- 直接选择排序-堆排序-冒泡排序-快速排序-归并排序-计数排序

    八大排序 1.直接插入排序 2.希尔排序 3.直接选择排序 直接选择排序改进 4.堆排序 1.建堆 2.利用堆删除思想来进行排序 5.冒泡排序 6.快速排序 递归实现 非递归实现 7.归并排序 递归实 ...

  5. 二叉树层次遍历算法 python_二叉树的遍历详解:前、中、后、层次遍历(Python实现)...

    二叉树的遍历详解:前.中.后.层次遍历(Python实现) 二叉树是一种常见的数据结构,而它的常见遍历方法有前序遍历.中序遍历.后续遍历.层次遍历--掌握这几种遍历方法是很有必要的. 假设我们二叉树节 ...

  6. 二叉树前中后序遍历的非递归实现以及层次遍历、zig-zag型遍历详解

    前言 二叉树的遍历是一个比较常见的问题,递归实现二叉树的前中后序遍历比较简单,但非递归实现二叉树的前中后序遍历相对有难度.这篇博客将详述如何使用非递归的方式实现二叉树的前中后序遍历,在进行理论描述的同 ...

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

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

  8. 图遍历详解(C语言版)

    文章目录 一.定义 二.方法 1.深度优先遍历 2.广度优先遍历 三.实现 1.无向图或强连通有向图遍历 2.非连通图遍历 结语 附录 一.定义 从给定图中任意指定的顶点(称为初始点)出发,按照某种搜 ...

  9. #转载:杨辉三角形实现过程详解-c语言基础

    杨辉三角形实现过程详解-C语言基础 十一一个人 2018-12-26 06:45:45 6465 收藏 28 最后发布:2018-12-26 06:45:45首发:2018-12-26 06:45:4 ...

最新文章

  1. C语言strcpy,strncpy和strlcpy讲解
  2. 创业路上有指引,永洪CEO给企业服务型创业公司的融资建议
  3. 关于创建SWAP示例
  4. 前端学习(3332):ant design介绍button
  5. 40 SD配置-销售凭证设置-分配计划行类别
  6. 通过JDK动态代理实现拦截器
  7. 2.策略模式(Strategy)
  8. C++从屏幕输入数字以空格分割,存入整型数组
  9. AlphaGo Zero算法讲解
  10. 服务器两块硬盘怎么合并,Windows2008磁盘合并和分区教程
  11. 达叔的游戏框架(二) 得到其他模块的方式
  12. 德鲁克谈《自我管理》——《哈佛商业评论》史上最受欢迎的文章
  13. php如何配置gii,深入浅析yii2-gii自定义模板的方法
  14. centos7安装或升级Google chrome、安装Firefox浏览器详细过程及设置桌面快捷方式
  15. 狼与狗的本质区别:从打工到老板的突破
  16. 非官方新人参考之quake3入门碎解
  17. Word-embeding 【paper】
  18. 微信小程序引入原生组件——WeUI组件库,详细步骤
  19. swift之网络请求框架Alamofire
  20. BAT54肖特基二极管;引脚配置 BAV99 串联二极管规格

热门文章

  1. 关于springboot转发重定向以及受保护目录的一些规律
  2. CustomValidator 控件
  3. QPCore Service 是什么?是否可以禁用?如何彻底删除它?
  4. 电脑合上盖子不锁屏_笔记本合上盖子不锁屏
  5. Web3的“陨落”,西下与东升
  6. JavaScript常用数组操作方法
  7. HJ1 字符串最后一个单词的长度
  8. 双十一值得入手的运动耳机有哪些?值得推荐的六款热门运动耳机
  9. JAVA中如何使用IDEA实现反编译(图片详解)
  10. 【往事清零,未来可期】研究生入学前的50天,我干了什么“见不得人”的勾当...