【数据结构OJ】BFS算法的可视化:二叉树“层序遍历”

【数据结构OJ】BFS算法的可视化:二叉树“层序遍历”

今天我们来分享一道关于二叉树层序遍历的OJ算法题

目录

题目介绍:

1、核心定义

2、实现核心及思路

解题思路:

思路可视化:

代码实现:

代码测试:


题目介绍:

接口函数以及二叉树节点结构:

/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ class Solution { public: vector<vector<int>> levelOrderBottom(TreeNode* root) { } };

题目来源:leetcode:107.二叉树的层序遍历II

1、核心定义

二叉树的层序遍历,又称广度优先遍历(BFS),是指从根节点开始,按“从上到下、从左到右”的顺序逐层访问树中所有节点,先遍历完第1层(根节点),再遍历第2层,以此类推,直到最后一层的所有节点都被访问。

2、实现核心及思路

二叉树层序遍历的本质就是 “先进先出” 的访问逻辑队列是实现该逻辑给关键数据结构。



大概思路:我们可以将二叉树的节点的地址存入队列,同时,用一个level_k_size来记录每一层的节点个数,和一个数组 v 来存储每一层数据,然后利用" level_k_size-- " 来控制节点出队列的个数,保证每一层的节点都能够出尽,在节点出队列的同时将节点的val值插入数组v并将该节点不为空的孩子节点继续带入队列;这样利用 level_k_size每循环一次得到一层的数据,直到遍历完整个二叉树。

解题思路:

(1)通过题目介绍,我们知道函数最后需要返回vector<vector<int>>的二维数组,所以,我们先创建一个二维数组 vv

(2)判断二叉树是否为空,即根结点root是否为nullptr。若为空则则不做处理,最后返回一个空的二维数组vv;不为空,则将根结点root入队列,同时 level_k_size记录节点个数为1

(3)根据level_k_size来遍历已经入队列的节点。由于level_k_size记录的是对应一层的节点数,就可以用 level_k_size作为while循环的循环次数来遍历节点利用队列的front接口函数获取队头的节点,将队头节点的val值插入到数组v(可以用vector创建数组),然后,将该节点不为空的孩子节点带入队列,同时,将队头节点出队列(pop)

⭐️注意:a.  这里不能直接将节点直接出队列,防止节点被释放而找不到孩子节点。可以用node记下该节点,然后pop(删除队头节点)。

b. 每次出队头节点都要保证将其对应的不为空的左右孩子节点带入队列,保证在下一次遍历时,已经出队列的节点的下一层的所有节点都在队列中,便于准确更新level_k_size的值。

(4)遍历完一层的节点之后,将数组v中的数据插入(push_back)到二维数组vv,然后更新level_k_size的值,得到下一层节点的个数。

(5)当队列中再没有节点时,证明二叉树的所有节点已经都遍历完了,因为上一层节点的左右孩子节点都为空,即二叉树遍历完成。但是,题目要求我们从二叉树的叶子节点所在层开始向上遍历,所以,我们先将二维数组vv进行逆置处理(reverse),再返回即可。

思路可视化:

代码实现:

class Solution { public: vector<vector<int>> levelOrderBottom(TreeNode* root) { vector<vector<int>> vv; // 创建二维数组 int level_k_size=0; if(root!=nullptr) { _q.push(root); // 插入根结点 level_k_size=1; // 记录节点个数 } while(!_q.empty()) { vector<int> v; // 创建数组v while(level_k_size--) // 遍历一层 { TreeNode* node=_q.front(); //记下队头节点 _q.pop(); // 释放 v.push_back(node->val); // 将数据插入到v if(node->left) // 带入左孩子节点 { _q.push(node->left); } if(node->right) // 带入右孩子节点 { _q.push(node->right); } } vv.push_back(v); // 将数组v的数据插入二维数组 level_k_size=_q.size(); // 更新level_k_size的值 } reverse(vv.begin(),vv.end()); // 逆置 return vv; } private: queue<TreeNode*> _q; // 成员变量(队列) };

代码测试:

int main() { solution s; // 创建一棵二叉树 TreeNode node1(3); TreeNode node2(9); TreeNode node3(20); TreeNode node4(15); TreeNode node5(15); TreeNode node6(7); // 连接 node1._left = &node2; node1._right = &node3; node2._left = &node4; node3._left = &node5; node3._right = &node6; vector<vector<int>> vv; vv = s.levelOrderTravelsal(&node1); // 调用函数 for (int i = 0; i < 3; i++) { for (int j = 0; j < vv[i].size(); j++) { cout << vv[i][j] << " "; } cout << endl; } }

本期的分享就到此结束👇️👇️👇️

Read more

Flutter for OpenHarmony:data_assets — 资源映射与自动装配实践(适配鸿蒙 HarmonyOS Next ohos)

Flutter for OpenHarmony:data_assets — 资源映射与自动装配实践(适配鸿蒙 HarmonyOS Next ohos)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net。 前言 在大型鸿蒙(OpenHarmony)工程中,手动管理静态资源路径极其容易出错。data_assets 提供了一套严谨的代码生成方案,能自动扫描资源并将其转换为强类型的 Dart 类,从根本上消灭了资源引用的运行时错误。 一、核心价值 1.1 基础概念 data_assets 的核心是资源到代码的静态映射。 引用 Assets.homeIcon 编译期校验路径 导致 assets/data: JSON, PNG, SVG DataAssets 生成器 assets.dart: 强类型索引类 鸿蒙业务逻辑 错误的文件名 编译失败提示 1.2 进阶概念 * Type Safety (类型安全):将字符串路径转化为

By Ne0inhk

Ubuntu24.04.3——ROS2一键安装

这篇文章在开局需要叠个甲,这片文章基本上是摘自于B站up鱼香ROS机器人的动手学ROS2文章(链接:动手学ROS2),如有侵权,请联系我删除,相关视频参考【鱼香ROS】动手学ROS2|ROS2基础入门到实践教程|小鱼带你手把手学习ROS2_哔哩哔哩_bilibili 一、一键安装ROS2 首先启动虚拟机或者启动双系统中的ubuntu,打开终端(快捷键Alt+Ctrl+T) 输入下面的指令 wget http://fishros.com/install -O fishros && . fishros 输入密码 在选项界面选择1-一键安装 注意这里的24.=版本的ubuntu只有jazzy和rolling版本,我选的是jazzy版本,选什么版本会导致之后你的终端命令的一些代码会有改动。 出现如图所示,即ROS2安装完成 2.出现问题可以这样卸载 sudo apt remove ros-jazzy-* sudo apt autoremove 3.ROS2到底装哪里了

By Ne0inhk
ubuntu24.04+5090显卡驱动安装踩坑

ubuntu24.04+5090显卡驱动安装踩坑

⭐安装ubuntu24.04 在选择进入 try or install ubuntu 之后会出现持续黑屏现象, 卡在了 booting a command list 解决方案: 选中 try or install ubuntu  按键盘 "e" 进入编辑模式 找到下列位置并添加  nomodeset acpi=off noapic 参数 按下 键盘F10,就可以正常安装 ubuntu 24.04系统了 ⭐安装显卡驱动前置条件 第一步 升级内核 uname -a 查看内核版本 安装5090显卡 必须要将内核版本升级到 6.13 ,用`mainline`工具安装 1.

By Ne0inhk
Flutter 组件 heart 适配鸿蒙 HarmonyOS 实战:分布式心跳监控,构建全场景保活检测与链路哨兵架构

Flutter 组件 heart 适配鸿蒙 HarmonyOS 实战:分布式心跳监控,构建全场景保活检测与链路哨兵架构

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 heart 适配鸿蒙 HarmonyOS 实战:分布式心跳监控,构建全场景保活检测与链路哨兵架构 前言 在鸿蒙(OpenHarmony)生态迈向万物智联、涉及海量传感器节点通信、分布式长连接保活及实时状态同步的背景下,如何确保终端设备在弱网、休眠或异常断电场景下仍能被母座感知,已成为决定系统可用性的“生命信标”。在鸿蒙设备这类强调分布式软总线协同与严苛电源管理的环境下,如果应用依然依赖基础的 HTTP 定时轮询执行状态探测,由于由于 CPU 频繁唤醒带来的功耗负担及无状态协议的连接开销,极易由于由于心跳风暴导致设备续航崩穿或大规模误判掉线。 我们需要一种能够实现毫秒级超时检测、支持异步回调闭环且具备高性能状态机控制的心跳监控方案。 heart 为 Flutter 开发者引入了轻量级且工业标准的“心搏”治理范式。它通过对 Ping-Pong 交互的时序解构,将复杂的超时重试与状态翻转逻辑封装为声明式的配置。在适配到鸿蒙 HarmonyO

By Ne0inhk