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

【数据结构】——队列实现二叉树的功能

前言:二叉树的实现方式多种多样,有数组实现满二叉树,有链表实现完全二叉树,今天我们就用队列来实现二叉树。

在这里插入图片描述

创建二叉树:

typedef int BTDataType;
typedef struct BinaryTreeNode
{BTDataType data;struct BinaryTreeNode* left;struct BinaryTreeNode* right;
}TreeNode;

层序遍历:

void LevelOrder(TreeNode* root)
{Queue q;QueueInit(&q);if (root)QueuePush(&q, root);int levelSize = 1;while (!QueueEmpty(&q)){// 一层一层出while (levelSize--){TreeNode* front = QueueFront(&q);QueuePop(&q);printf("%d ", front->data);if (front->left)QueuePush(&q, front->left);if (front->right)QueuePush(&q, front->right);}printf("\n");levelSize = QueueSize(&q);}printf("\n");QueueDestroy(&q);
}

我们的队列是用来存放二叉树节点的,所以我们的目的是将节点一层一层的遍历出来,所以我们的第一层是根节点,我们把它放入队列,出队列的时候就要带它的左子树和右子树节点进入队列,那么我们怎么知道每层的节点数呢?我们定义一个levelSize,初始值为1。
在这里插入图片描述
我们的levelSize是每层的节点个数,我们的节点个数因为在队列中,所以我们的个数就等于队列的数据个数,即levelSize = QueueSize(&q),我们通过循环让节点一层一层的出队列打印出来就达到了我们的目的。整个过程如下图所示:
在这里插入图片描述

判断二叉树是否是完全二叉树:

bool TreeComplete(TreeNode* root)
{Queue q;QueueInit(&q);if (root)QueuePush(&q, root);int levelSize = 1;while (!QueueEmpty(&q)){TreeNode* front = QueueFront(&q);QueuePop(&q);if (front == NULL)break;QueuePush(&q, front->left);QueuePush(&q, front->right);}// 前面遇到空以后,后面还有非空就不是完全二叉树while (!QueueEmpty(&q)){TreeNode* front = QueueFront(&q);QueuePop(&q);if (front){QueueDestroy(&q);return false;}}QueueDestroy(&q);return true;
}

我们这里同样按照节点的顺序给它入队列和出队列,我们的levelSize控制每一层的数据,我们的根节点出队列就将它的左子树和右子树带入队列,如果中间有一个子树为空那么就退出循环,但是我们后面如果还有不为空的节点,也就是不连续的话,那么就不是完全二叉树。
在这里插入图片描述
我们拿到2的左子树3后,出队列,再拿2的右子树,2的右子树为空所以就结束循环,我们在到队列里面取队列首元素,再出队列,队列的元素不为空,说明二叉树不连续,所以该树就不是,完全二叉树,反之就是完全二叉树。

如果对大家有帮助的话就支持一下吧!感谢大家的支持!

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

相关文章:

  • 【已解决】Win7虚拟机安装VMtools报错
  • 华为OD机试真题-小明找位置-2023年OD统一考试(C卷)
  • 2023.2版idea安装教程,现在jdk8已经过去式了,不同idea支持的jdk不同。升级jdk后idea也要随之升级
  • CSS3技巧36:让内容垂直居中的三种方式
  • 空间运算设备-Apple Vision Pro
  • cocos creator “TypeError: Cannot set property ‘string‘ of null
  • 简谈MySQL的binlog模式
  • Linux 环境部署RabbitMQ
  • 【1day】泛微e-office OA系统xml.php 文件 SORT_ID 参数 SQL 注入漏洞学习
  • 智能无人零售:革新零售消费体验的未来
  • 代币化对网约车区块链平台的影响
  • YOLOv7 学习笔记
  • 【51单片机系列】74HC595实现对LED点阵的控制
  • Canal笔记:安装与整合Springboot模式Mysql同步Redis
  • C++的继承语法
  • C# .NET平台提取PDF表格数据,并转换为txt、CSV和Excel表格文件
  • spring boot学习第五篇:spring boot与JPA结合
  • 代理IP怎么使用?Mac苹果系统设置http代理IP教程
  • postgresql_conf中常用配置项
  • 使用MfgTool烧写前需准备的文件
  • SAP UI5 walkthrough step4 XML Views
  • Java 1对1
  • 云服务器Centos中安装Docker
  • 人工智能教程(三):更多有用的 Python 库
  • 【带头学C++】----- 九、类和对象 ---- 9.10 C++设计模式之单例模式设计
  • Qt之QCache和QContiguousCache
  • Django讲课笔记01:初探Django框架
  • JS中的闭包
  • 深度学习在计算机视觉中的应用
  • 模板与泛型编程