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

【数据结构】使用队列解决二叉树问题

1.层序遍历

A先进队列,迭代-》队列不为空,拿出队头的数据然后将队头的左右节点放入队列,不断拿出放入,又队列满足先进先出的特性,无论这棵树多大都能实现层序遍历;

我们这里需要用到队列,可以在我的这篇文章中获取:

【数据结构】队列-CSDN博客

修改一下队列的数据类型

//层序遍历
void BinaryTreeLevelOrder(BTNode* root)
{Queue q;QueueInit(&q);if (root == NULL)return;QueuePush(&q, root);  // 根节点先入队while (!QueueEmpty(&q))  // 队列不为空时循环{BTNode* front = QueueFront(&q);  // 获取队头节点QueuePop(&q);  // 队头节点出队printf("%c ", front->_data);  // 访问节点(打印数据)// 左右子节点入队(如果存在)if (front->_left)QueuePush(&q, front->_left);if (front->_right)QueuePush(&q, front->_right);}QueueDestroy(&q);printf("\n");
}

假设我们有如下二叉树:

        A/ \B   C/ \   \D   E   F

执行流程如下:

  1. 初始化队列,将 A 入队 → 队列:[A]

  2. 队列非空,取出 A 并打印,将 B、C 入队 → 队列:[B, C],输出:A

  3. 队列非空,取出 B 并打印,将 D、E 入队 → 队列:[C, D, E],输出:A B

  4. 队列非空,取出 C 并打印,将 F 入队 → 队列:[D, E, F],输出:A B C

  5. 队列非空,取出 D 并打印,无子女入队 → 队列:[E, F],输出:A B C D

  6. 队列非空,取出 E 并打印,无子女入队 → 队列:[F],输出:A B C D E

  7. 队列非空,取出 F 并打印,无子女入队 → 队列:[],输出:A B C D E F

  8. 队列为空,循环结束,销毁队列

最终输结果为:A B C D E F ,正好是按层序访问的结果。

2.判断二叉树是否为完全二叉树

遇到NULL就break跳出循环,然后接着判断剩下队列的数据,如果都是空,说明这个是完全二叉树;

//判断二叉树是否为满二叉树
//是返回1,不是返回0
int BinaryTreeComplete(BTNode* root)
{Queue q;QueueInit(&q);if (root == NULL)return;QueuePush(&q, root);while (!QueueEmpty(&q)){BTNode* front = QueueFront(&q);QueuePop(&q);if (front == NULL){break;}QueuePush(&q, front->_left);QueuePush(&q, front->_right);}while (!QueueEmpty(&q)){BTNode* front = QueueFront(&q);QueuePop(&q);if (front){QueueDestroy(&q);return 0;}}QueueDestroy(&q);return 1;
}

相关文章:

【数据结构】树的概念及结构-CSDN博客

【数据结构】二叉树概念及结构 -CSDN博客

【数据结构】堆-“此堆非比堆”-CSDN博客

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

相关文章:

  • 通信方式:命名管道
  • 如何禁用 Windows 服务器的自动更新以避免意外重启
  • 协程库项目面试常见问题 | 简历写法
  • 使用OpenCV计算灰度图像的质心
  • 前端面试核心技术30问
  • Springboot使用Selenium+ChormeDriver在服务器(Linux)端将网页保存为图片或PDF
  • 【完整源码+数据集+部署教程】太阳能板表面损伤检测图像分割系统源码和数据集:改进yolo11-DynamicHGNetV2
  • Linux------《操作系统全景速览:Windows·macOS·Linux·Unix 对比及 Linux 发行版实战指南》
  • C#项目集成海康SDK指南:从搭建环境到实现视频预览、录制、截屏
  • 什么是AKSK?
  • F003疫情传染病数据可视化vue+flask+mysql
  • 100202Title和Input组件_编辑器-react-仿低代码平台项目
  • 全平台轻量浏览器推荐|支持Win/macOS/Linux,极速加载+隐私保护+扩展插件,告别广告与数据追踪!
  • 私有化部署全攻略:开源大模型本地化改造的性能与安全深度评测
  • 在 IntelliJ IDEA 中修改 Git Commit 描述
  • Linux的ALSA音频框架学习笔记
  • Voice Agents:下一代语音交互智能体的架构革命与产业落地
  • 项目一系列-第5章 前后端快速开发
  • 【qml-5】qml与c++交互(类型单例)
  • 如何计算 PCM 音频与 YUV/RGB 原始视频文件大小?
  • 【Git Submodules 与微前端架构技术指南】
  • 指针的应用学习日记
  • Hive 存储管理测试用例设计指南
  • CSDN 创始人蒋涛:以开源驱动技术创新,拥抱黄金十年
  • 【SpringBoot】15 核心功能 - Web开发原理 - 请求处理 - 常用请求参数注解
  • 如何安全删除GitHub中的敏感文件?git-filter-repo操作全解析
  • 玳瑁的嵌入式日记D20-08019(数据结构)
  • Hive常用命令参考
  • 开源游戏引擎Bevy 和 Godot
  • 分布式搜索(Elasticsearch)深入用法