当前位置: 首页 > news >正文

《二叉树》——3(层序遍历)

目录

前言:

层序遍历:

解析:


前言:

本文主讲链式二叉树的层序遍历,在前面的张篇blog我们初步实现了链式二叉树递归部分的内容,对于递归算法的学习和思维方式我们仍然需要不断加强,所以将对链式二叉树进行收尾,下一章我们将开启递归算法的题目强化训练。

层序遍历:

typedef struct BTTreeNode* QDataType;
//将链队列中的节点类型改为struct BTTreeNode(二叉树节点的数据类型)void TreeLevelOrder(TreeNode* root)
{Queue q;QueueInit(&q);if (root == NULL){printf("空树\n");exit(-1);}int levelsize = 1;QueuePush(&q, root);while (!QueueEmpty(&q)){while (levelsize--){TreeNode* front = QueueFront(&q);printf("%d ", front->data);if (front->left){QueuePush(&q, front->left);}if (front->right){QueuePush(&q, front->right);}QueuePop(&q);}printf("\n");levelsize = QueueSize(&q);}printf("\n");QueueDestroy(&q);
}

层序遍历不需要用到递归的思想,用我们之前学习过的队列的知识就可以实现层序遍历。

这里是用到队列的先进先出的特性。

以上是一颗二叉树,现在要实现该数的层序遍历,最终结果为:

1

2 4

3 5 6

解析:

    Queue q;QueueInit(&q);if (root == NULL){printf("空树\n");exit(-1);}int levelsize = 1;QueuePush(&q, root);

 对于这一串代码,就是定义队列并且初始化,并将根节点入队列,再定义一个队列长度,用来接受队列里的节点数,当levelsize为空时,就代表当前层数的节点已经打印完毕。因为是将根节点入队列,而且第一层有且只有一个节点,即根节点,所以levelsize = 1;

while (!QueueEmpty(&q)){while (levelsize--){TreeNode* front = QueueFront(&q);printf("%d ", front->data);if (front->left){QueuePush(&q, front->left);}if (front->right){QueuePush(&q, front->right);}QueuePop(&q);}printf("\n");levelsize = QueueSize(&q);}

 

目前的队列如上图所示。

首先我们需要将定义front指针指向队列的第一个元素。

此时我们需要将root的左右子树入队列,首先我们需要判断左右子树是否为空树。

如果不是空树就入队列。

则有:

 

而这个时候front指向的节点会被先打印出来,再出队列,这时候front就会指向下一个节点,并且levelsize也为0,因为这时候队列的首数据已经出队列,所以队列中只有两个数据,那么levelsize就会被赋值为2。

如图:

 

 同样,接下来就是判断front指向的节点的左右子树是否为空,不为空则入队列。

即:

由于levelsize为2,所以程序会打印队列的前两个数据,即24

2打印完后,front就会指向4这个节点,同样也会判断该节点的左右子树是否为空,不为空则入队列。

如图:

 

然后打印完4的节点后,levelsize又会被赋值为3,用来答应下一层的节点。

 

如此不断重复,层序遍历则完美实现。 

http://www.lryc.cn/news/291372.html

相关文章:

  • HarmonyOS应用开发者基础认证考试答案
  • 【前端素材】bootstrap3 实现地产置业公司source网页设计
  • C++ 数论相关题目 博弈论 Nim游戏
  • 机器学习---无偏估计
  • C语言基础13
  • 【Java】Maven配置加载到全局
  • 右手螺旋线定则
  • 2024 高级前端面试题之 React 「精选篇」
  • OSPF协议解析及相关技术探索(C/C++代码实现)
  • 如何恢复已删除的照片?
  • VMware虚拟机安装macOS
  • API管理协作工具:Apipost
  • GPT-SoVITS 本地搭建踩坑
  • 【教学类-34-02】20240130纸尺2.0 (A4横版5条,刻度25*5=125CM,有图案)
  • iText操作pdf
  • 关于SQLite 的下载与使用。配合python
  • java面向对象基础(面试)
  • 【C++修行之道】STL(初识list、stack)
  • 【环境配置】安装了pytorch但是报错torch.cuda.is_availabel()=Flase
  • 什么是模板方法模式?它的实现方式有哪些?
  • java:实现查询MySQL数据库中的数据,并导出excel、pdf类型文档(超详细)
  • Java后端须知的前端知识
  • Servlet基础之URL匹配规则
  • 【面试真题】Javascript 实现多条件过滤数组
  • spark广播变量
  • 如何让wordpress首页只显示某一篇文章全部内容?在您的主页显示选择
  • Git怎样用?(下载到本地,和在本地初始化)
  • JVM基础知识汇总篇
  • 马哈鱼SQLFlow Lite的python版本
  • 【原创】VMware创建子网,并使用软路由获得访问互联网的能力,并通过静态路由让上层网络访问位于虚拟机的子网