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

二叉树层序遍历与高度计算详解

一、先解答上次的思考题

Day12 已经给出练习答案,这里不再重复,我们直接进入层序遍历。


二、今天学习目标

  1. 理解层序遍历(按一层一层打印)
  2. 队列实现层序遍历(BFS 思想)
  3. 递归 + 迭代两种方式求二叉树高度
  4. 完整可运行代码,直接复制就能用

三、什么是层序遍历?

从上到下、从左到右,一层一层访问节点。

示例树:

1 / \ 2 3 / \ 4 5

层序遍历结果:1 2 3 4 5


四、层序遍历实现思路

核心:用队列保存每一层节点

  1. 根节点入队
  2. 队不空时:
    • 出队一个节点并访问
    • 左孩子入队
    • 右孩子入队

五、完整代码(层序遍历 + 求树高)

#include <stdio.h> #include <stdlib.h> // 二叉树节点结构 struct TreeNode { int data; struct TreeNode *left; struct TreeNode *right; }; // 队列节点(用于层序遍历) struct QueueNode { struct TreeNode *node; struct QueueNode *next; }; // 简单队列结构 struct Queue { struct QueueNode *front; struct QueueNode *rear; }; // 创建树节点 struct TreeNode* createNode(int val) { struct TreeNode* node = (struct TreeNode*)malloc(sizeof(struct TreeNode)); node->data = val; node->left = NULL; node->right = NULL; return node; } // 初始化队列 struct Queue* createQueue() { struct Queue *q = (struct Queue*)malloc(sizeof(struct Queue)); q->front = q->rear = NULL; return q; } // 入队 void enQueue(struct Queue *q, struct TreeNode *node) { struct QueueNode *newNode = (struct QueueNode*)malloc(sizeof(struct QueueNode)); newNode->node = node; newNode->next = NULL; if (q->rear == NULL) { q->front = q->rear = newNode; return; } q->rear->next = newNode; q->rear = newNode; } // 出队 struct TreeNode* deQueue(struct Queue *q) { if (q->front == NULL) return NULL; struct QueueNode *temp = q->front; struct TreeNode *res = temp->node; q->front = q->front->next; if (q->front == NULL) q->rear = NULL; free(temp); return res; } // 判断队列空 int isQueueEmpty(struct Queue *q) { return q->front == NULL; } // ==================== 1. 层序遍历 ==================== void levelOrder(struct TreeNode *root) { if (root == NULL) return; struct Queue *q = createQueue(); enQueue(q, root); while (!isQueueEmpty(q)) { struct TreeNode *cur = deQueue(q); printf("%d ", cur->data); if (cur->left != NULL) enQueue(q, cur->left); if (cur->right != NULL) enQueue(q, cur->right); } } // ==================== 2. 求二叉树高度(递归) ==================== int treeHeight(struct TreeNode *root) { if (root == NULL) return 0; int leftH = treeHeight(root->left); int rightH = treeHeight(root->right); return (leftH > rightH ? leftH : rightH) + 1; } // ==================== 主函数测试 ==================== int main() { // 构建二叉树 struct TreeNode* root = createNode(1); root->left = createNode(2); root->right = createNode(3); root->left->left = createNode(4); root->left->right = createNode(5); printf("层序遍历:"); levelOrder(root); printf("\n树的高度:%d\n", treeHeight(root)); return 0; }

六、运行结果

层序遍历:1 2 3 4 5 树的高度:3

七、核心知识点小结

  1. 层序遍历 = BFS = 队列实现
  2. 树高度 = max (左子树高,右子树高) + 1
  3. 前 / 中 / 后序是 DFS(深度优先),层序是 BFS(广度优先)

八、今日小练习

对下面这棵树:

10 / \ 20 30 \ 40

求:

  1. 层序遍历结果
  2. 树的高度

答案:

  • 层序:10 20 30 40
  • 高度:3

九、明日预告

二叉搜索树 BST增、删、查、中序遍历有序,面试最常用树结构。

http://www.jsqmd.com/news/609393/

相关文章:

  • Mojo-Python混合调试实战:VS Code+GDB+Mojo Debugger三端联动排错(含2026最新符号表映射漏洞修复补丁)
  • 别再让用户输密码了!华为欧拉系统systemctl权限下放实战(附visudo安全操作指南)
  • 可测试性设计:让代码更容易被测试——软件测试从业者的专业指南
  • 【仅限首批200名工业自动化开发者】:C# OPC UA高可用集群方案白皮书(双活发布订阅+故障自动切换+毫秒级RTO实测数据)
  • 压电陶瓷震动传感器的特性与JFET放大电路设计
  • MIKEURBAN几种错误解决方法
  • GCN实战解析:从谱图卷积到半监督节点分类
  • 目标检测进阶—Cascade R-CNN 的多阶段优化策略解析
  • 《Signal, Image and Video Processing》投稿避坑指南:从LaTeX排版到审稿全流程解析
  • 揭秘MySQL索引分类仕
  • Windows 11终极优化指南:使用Win11Debloat实现系统性能提升的完整教程
  • 代码之外周刊(第期):当技术让一切趋同,我们还剩什么?簇
  • 6月PMP紧急预警:错过这次,下次难度让你哭!附60天极简通关计划
  • 队列—链式队列
  • 2026人生第一双高跟鞋选购指南:轻奢女鞋标杆名录 - 资讯焦点
  • 别再暴力搜索了!用动态规划优化旅行商问题,C++代码效率提升实战
  • 联邦学习超参数C、E、B怎么调?我用PyTorch在MNIST上做了组对比实验
  • 【PHP电商订单原子性终极解法】:不依赖数据库事务,用CAS+版本号+本地消息表实现跨服务强一致下单
  • 热键侦探:Windows系统热键冲突的技术破局之道
  • Java final关键字与抽象类深度解析
  • 中小企业PTC软件许可证成本控制实用技巧
  • 迈富时企业级AI操作系统:从中台到智能体的商业价值重构 - 资讯焦点
  • 小程序开发完整步骤,零基础如何制作小程序 - 码云数智
  • 第三天学习
  • 【物理应用】基于matlab碳酸盐岩前向建模(特征包括光带产电、迭代压实、波能、热沉降、轮状图)【含Matlab源码 15306期】
  • 使用钉钉远程操作你的claude code露
  • 微搭低代码MBA 培训管理系统实战 26——首页搭建
  • 基于半导体光放大器的光纤环形腔激光器
  • 迈富时全链路AI应用:本体级建模与跨系统协同执行实践 - 资讯焦点
  • Day15——多维数组