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

刷题日常 4 二叉树层序遍历

方法一:广度优先搜索
思路和算法

我们可以用广度优先搜索解决这个问题。

我们可以想到最朴素的方法是用一个二元组 (node, level) 来表示状态,它表示某个节点和它所在的层数,每个新进队列的节点的 level 值都是父亲节点的 level 值加一。最后根据每个点的 level 对点进行分类,分类的时候我们可以利用哈希表,维护一个以 level 为键,对应节点值组成的数组为值,广度优先搜索结束以后按键 level 从小到大取出所有值,组成答案返回即可。

考虑如何优化空间开销:如何不用哈希映射,并且只用一个变量 node 表示状态,实现这个功能呢?

我们可以用一种巧妙的方法修改广度优先搜索:

首先根元素入队
当队列不为空的时候
求当前队列的长度 s 
i


依次从队列中取 s 
i

个元素进行拓展,然后进入下一次迭代
它和普通广度优先搜索的区别在于,普通广度优先搜索每次只取一个元素拓展,而这里每次取 s 
i

个元素。在上述过程中的第 i 次迭代就得到了二叉树的第 i 层的 s 
i

个元素。

为什么这么做是对的呢?我们观察这个算法,可以归纳出这样的循环不变式:第 i 次迭代前,队列中的所有元素就是第 i 层的所有元素,并且按照从左向右的顺序排列。证明它的三条性质(你也可以把它理解成数学归纳法):

初始化:i=1 的时候,队列里面只有 root,是唯一的层数为 1 的元素,因为只有一个元素,所以也显然满足「从左向右排列」;
保持:如果 i=k 时性质成立,即第 k 轮中出队 s 
k

的元素是第 k 层的所有元素,并且顺序从左到右。因为对树进行广度优先搜索的时候由低 k 层的点拓展出的点一定也只能是 k+1 层的点,并且 k+1 层的点只能由第 k 层的点拓展到,所以由这 s 
k

个点能拓展到下一层所有的 s 
k+1

个点。又因为队列的先进先出(FIFO)特性,既然第 k 层的点的出队顺序是从左向右,那么第 k+1 层也一定是从左向右。至此,我们已经可以通过数学归纳法证明循环不变式的正确性。
终止:因为该循环不变式是正确的,所以按照这个方法迭代之后每次迭代得到的也就是当前层的层次遍历结果。至此,我们证明了算法是正确的。
代码

C++
Java
JavaScript
Golang
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector <vector <int>> ret;
if (!root) {
return ret;
}

        queue <TreeNode*> q;
q.push(root);
while (!q.empty()) {
int currentLevelSize = q.size();
ret.push_back(vector <int> ());
for (int i = 1; i <= currentLevelSize; ++i) {
auto node = q.front(); q.pop();
ret.back().push_back(node->val);
if (node->left) q.push(node->left);
if (node->right) q.push(node->right);
}
}

return ret;
}
};
复杂度分析

记树上所有节点的个数为 n。

时间复杂度:每个点进队出队各一次,故渐进时间复杂度为 O(n)。
空间复杂度:队列中元素的个数不超过 n 个,故渐进空间复杂度为 O(n)。

http://www.dtcms.com/a/596849.html

相关文章:

  • field ——AUTOCAD设置字段
  • SVN 启动模式
  • 论文阅读《Curse of Rarity for Autonomous Vehicles》(稀疏度灾难CoR)
  • dw怎么做网站地图室内设计效果图高清
  • 专业建设信息化网站资源中英文外贸网站模版
  • 冲压和模具制造案例丨通过Prolink实现车间数据收集和分析自动化
  • Java:高效删除Excel中的空白行和列
  • Claude Code 重大更新:支持一键原生安装,彻底别了 Node.js
  • 技术漏洞被钻营!Agent 感知伪装借 ChatGPT Atlas 批量输出虚假数据,AI 安全防线面临新挑战
  • HarmonyOS布局优化实战:扁平化布局与高性能组件应用
  • 万能的开源制图利器 —— draw.io(diagrams.net)自托管与应用分享
  • 如何做海外淘宝网站个人网页设计作业
  • 花灯彩灯制作公司四川seo推广公司
  • CANN核心特性深度解析:简化AI开发的技术优势
  • YOLOv2算法详解(上篇):从经典到进化的目标检测之路
  • Detect Anything via Next Point Prediction论文解读
  • eclipse maven 项目 提示 http://maven.apache.org/xsd/maven-4.0.0.xsd‘
  • Spring AI Alibaba 静态RAG实战:让AI成为你的专属知识管家
  • iOS App帧率监控与流畅度优化全解析,多工具协同打造高帧体验的实战方案
  • 【底层机制】 Android ION内存分配器深度解析
  • [Windows] 开源跨平台远程桌面软件:CrossDesk v1.0.3
  • 青海公路工程建设总公司网站全新微信号2元一个自动下单
  • 网站开发的问题淮安做网站 卓越凯欣
  • 【Hot100|11-LeetCode 239. 滑动窗口最大值 】
  • Linux系统磁盘管理
  • 字节开源InfinityStar框架以32倍速挑战Sora范式
  • 买房签合同流程记录
  • VR新能源体验系统:VR 架起清洁能源的认知之桥
  • Jenkins VS GitLab CI/CD VS Arbess,CI/CD工具选型指南
  • 5.1、Python-字符串