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

024.二叉树层序遍历

二叉树的层序遍历就是Bfs(广度优先搜索)

因为步长一致

框架:

    queue<TreeNode*>qu;qu.push(root);while(!qu.empty()){int siz=qu.size();//当前层结点数量for(int i=0;i<siz;++i){//当前层结点全部出队auto cur=qu.front();qu.pop();//下一层结点入队if(cur->left!=nullptr){qu.push(cur->left);}if(cur->right!=nullptr){qu.push(cur->right);}}}

应用

借助层序遍历,我们可以自然地知道每个结点在第几层

如果题目要求我们在水平方向上进行操作,那十有八九需要用到层序遍历的思想

只需:

    queue<TreeNode*>qu;qu.push(root);int depth=0;//这里假设root深度为 1 ,若root深度为0这里初始化depth=-1即可while(!qu.empty()){depth++;//进入下一层int siz=qu.size();for(int i=0;i<siz;++i){auto cur=qu.front();qu.pop();if(cur->left!=nullptr){qu.push(cur->left);}if(cur->right!=nullptr){qu.push(cur->right);}}}

题目1

leetcode 117

给定一个二叉树:

struct Node {int val;Node *left;Node *right;Node *next;
}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点

如果找不到下一个右侧节点,则将 next 指针设置为 NULL

初始状态下,所有 next 指针都被设置为 NULL

class Solution {
public:Node* connect(Node* root) {if(root==NULL)return NULL;queue<Node*>q;q.push(root);while(q.size()){int siz=q.size();Node*p=NULL;//对每一层设置一个前置结点for(int i=0;i<siz;++i){auto c=q.front();q.pop();if(p!=NULL)p->next=c;//跳过最左边的结点p=c;if(c->left)q.push(c->left);if(c->right)q.push(c->right);}}return root;}
};

题目2

leetcode 958

给你一棵二叉树的根节点 root ,请你判断这棵树是否是一棵 完全二叉树

在一棵 完全二叉树 中,除了最后一层外,所有层都被完全填满,并且最后一层中的所有节点都尽可能靠左。最后一层(第 h 层)中可以包含 1 到 2h 个节点

直接说思路:

允许nullptr结点入队,当弹出第一个nullptr时说明层遍历结束,此时队列中因该只剩下nullptr

如果后面还有非空结点,说明不是完全二叉树

class Solution {
public:bool isCompleteTree(TreeNode* root) {queue<TreeNode*>q;q.push(root);bool end=0;while(q.size()){int siz=q.size();for(int i=0;i<siz;++i){auto c=q.front();q.pop();if(c==nullptr)end=1;//弹出空结点else{if(end)return 0;//当前结点非空且之前弹出过空结点//这里我们运行nullptr结点入队q.push(c->left);q.push(c->right);}}}return 1;//处理到这里说明合法}
};

题目3

leetcode 919

思路

两个队列q,qu

q 中存储有空孩子的结点,即:->leftnullptr || ->rightnullptr

qu 用于初始化,找到有空孩子的结点

需要 insert 新结点时 : 弹出 q.front() ,让新节点成为它的孩子,孩子满了就出队

同时新插入的结点也没有孩子,进入 q

class CBTInserter {TreeNode*root;int de;queue<TreeNode*>q;
public:CBTInserter(TreeNode* root) {this->root=root;queue<TreeNode*>qu;qu.push(root);while(qu.size()){int siz=qu.size();for(int i=0;i<siz;++i){auto c=qu.front();qu.pop();if(c->left)qu.push(c->left);if(c->right)qu.push(c->right);if(c->left==nullptr||c->right==nullptr)q.push(c);}}}int insert(int val) {TreeNode*node=new TreeNode(val);auto c=q.front();int v=c->val;if(c->left==nullptr)c->left=node;else if(c->right==nullptr){c->right=node;q.pop();}q.push(node);return v;}TreeNode* get_root() {return root;}
};
http://www.jsqmd.com/news/144721/

相关文章:

  • 024.二叉树层序遍历
  • 2025年12月成都米粉/米线/绵阳米粉加工厂口碑榜单 - 2025年品牌推荐榜
  • Shopee店铺如何起一个好名字
  • Android 12 RK3588平台电源菜单深度定制指南
  • Spring HATEOAS 详细介绍
  • 2025年济南做得好的翅片管公司有哪些,乏风取热箱/表冷器/翅片管/新风机组/干冷器/空调机组/空气幕/冷却器/散热器翅片管企业哪家好 - 品牌推荐师
  • 基于大数据的精品小说推荐与可视化分析系统(毕设源码+文档)
  • 2025年12月江苏徐州别墅庭院设计、屋顶花园设计、公园绿地设计、市政广场设计、生态园区设计服务商权威测评与综合推荐 - 2025年品牌推荐榜
  • 【路径规划】基于RRT快速探索随机树算法在三维环境中寻找从起点到目标点的路径,并对路径进行平滑处理附Matlab代码
  • 基于Python的购物管理系统毕设源码+文档+讲解视频
  • P3195 [HNOI2008] 玩具装箱 斜率优化
  • comsol悬浮绝缘子电场计算模型,可以得到绝缘子各个部位电势及电场分布,提供comsol详细...
  • mybatis insert后返回id
  • IRC协议:穿越时光的互联网实时聊天奠基者
  • 专科生必看!9个高效降aigc工具推荐,轻松过审不踩坑
  • Java面试:为何必须在循环中检查等待条件?避坑指南!
  • LuatOS下载不求人:完整流程与高频问题应对策略
  • 课后作业2
  • 2025年12月绵阳米粉/米线加工厂综合比较 - 2025年品牌推荐榜
  • 2025年12月江苏徐州别墅庭院设计、屋顶花园设计、公园绿地设计、市政广场设计、生态园区设计服务商排行榜 - 2025年品牌推荐榜
  • 运用 Python 将 Markdown 转换为 Word、HTML、PDF、PNG 和 JPG
  • 基于Spring Boot和Vue.js的视频点播管理系统设计与实现
  • pg_waldump 和 pg_xlogdump
  • 一个简单想法的实验随笔-胜任能力
  • 高精度光学动作捕捉如何为无人机提供飞行姿态与轨迹真值?——以IROS 2025多篇无人机学习与控制研究为例
  • 让回忆“动”起来:手把手教你制作老照片动态视频
  • 2025最新!自考党必看9个AI论文平台测评与推荐
  • CF1295F Good Contest/[APIO2016] 划艇
  • 郑州家装公司五大推荐:优质装修/别墅装修/老房翻新精选,华埔装饰砸无赦承诺引领行业新风尚 - 深度智识库
  • 基于Spring Boot和Vue.js的房屋出租管理系统设计与实现