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

【数据结构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;  // 创建数组vwhile(level_k_size--)  // 遍历一层{TreeNode* node=_q.front(); //记下队头节点_q.pop();                  // 释放v.push_back(node->val);    // 将数据插入到vif(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;}
}

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

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

相关文章:

  • RabbitMQ:在Linux上安装RabbitMQ
  • 大数据毕业设计选题推荐:基于Hadoop+Spark的全球能源消耗数据分析与可视化系统
  • 从避障到实时建图:机器学习如何让无人机更智能、更安全、更实用(附微型机载演示示例)
  • ui做的好的网站专业的深圳网站建设公司哪家好
  • 最简单的 Web 打印方案:用 5 分钟上手 web-print-pdf(npm 包)
  • 深度学习在自动驾驶上应用(二)
  • OpenLayers地图交互 -- 章节十二:键盘平移交互详解
  • Unity 透视摄像机视野适配不同分辨率的屏幕
  • 可持续金融的新范式:拆解欧盟ESG监管体系及其全球影响力
  • 【数据保护】一种安全高效的全匿踪纵向联邦学习方法
  • 阿里云物联网平台seo站外优化平台
  • 网站开发软件 手机网站做app有什么意义
  • WorldSimBench: 迈向作为世界模拟器的视频生成模型——论文解读
  • 嵌入式 - 内核驱动1 - 配置linux驱动
  • 工作中学习自己的Qt知识误区-Version3
  • C#连接达梦(DM)数据库
  • 服务器独立显卡可以亮机但进不了系统怎么办
  • 超高密度2kW GaN基低压电机驱动器的设计
  • 「日拱一码」100 机器学习辅助定向进化MLDE
  • C++项目:仿muduo库高并发服务器------EventLoop模块的设计
  • 电子商务网站开发综合实训报告h5页面制作工具包括
  • 全栈信创+AI大模型:百分点科技BD-OS重塑数据治理基座
  • 时隔一天第二阶段他来了 html!!!!!!!!!!!
  • [创业之路-596]:半导体生产中所需要光源的上下游产业链
  • spring-ai简单示例
  • sqlsugar sqlite
  • IP 授权管理标识:守护 IP 价值,解锁商业新可能
  • 深度学习学习路线图:从MNIST到MobileNetV4,从理论到实践的完整指南——基础理论与经典模型实践
  • C++项目:仿muduo库高并发服务器-------poller模块
  • 建设项目审批后公示在哪个网站国内重大新闻2022