Welcome to you每日一刷系列


二叉树的层序遍历

二叉树的层序遍历II

二叉树的右视图

二叉树的层平均值

N叉树的层序遍历

在每个树行中找最大值

填充每个节点的下一个右侧节点指针

填充每个节点的下一个右侧节点指针II

二叉树的最大深度

二叉树的最小深度


二叉树的层序遍历

广度优先搜索

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

  • 首先根元素入队
  • 当队列不为空的时候

1.求当前队列的长度 Si
       2.依次从队列中取 Si 个元素进行拓展,然后进入下一次迭代

class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) { //初始化队列同时将第一层节点加入队列中,即根节点queue<TreeNode*> az;vector<vector<int>> sz;if(root==nullptr){return sz;}az.push(root);//外层的while循环迭代的是层数while(!az.empty()){//记录当前队列大小int size=az.size();vector<int> a;//遍历这一层的所有节点for(int i=0;i<size;i++){ //从队首取出元素TreeNode* node=az.front();az.pop();a.push_back(node->val);if(node->left) az.push(node->left);if(node->right)az.push(node->right);}sz.push_back(a);}return sz;}
};

大家请记住这个模板,后面的几个练习题,都是在这个上面稍作更改.

二叉树的层序遍历II

相对于上面的题目,我们就需要把数组翻转一下就好了.

class Solution {
public:vector<vector<int>> levelOrderBottom(TreeNode* root) {vector<vector<int>> az;queue<TreeNode*> sz;if(root==nullptr){return az;}sz.push(root);while(!sz.empty()){vector<int> a;int size=sz.size();for(int i=0;i<size;i++){TreeNode* node=sz.front();sz.pop();a.push_back(node->val);if(node->left) sz.push(node->left);if(node->right) sz.push(node->right);}az.push_back(a);}reverse(az.begin(),az.end());return az;}
};

二叉树的右视图

层序遍历的时候,判断是否遍历到单层的最后面的元素,如果是,就放进result数组中,随后返回result就可以了。

class Solution {
public:vector<int> rightSideView(TreeNode* root) {vector<int> az;queue<TreeNode*> sz;if(root==nullptr){return az;}sz.push(root);while(!sz.empty()){int size=sz.size();for(int i=0;i<size;i++){TreeNode* node=sz.front();sz.pop();if(i==size-1){az.push_back(node->val);}if(node->left)sz.push(node->left);if(node->right)sz.push(node->right);}}return az;}
};

二叉树的层平均值

本题就是层序遍历的时候把一层求个总和在取一个均值。

class Solution {
public:vector<double> averageOfLevels(TreeNode* root) {vector<double> az;queue<TreeNode*> sz;if(root==nullptr)
{return az;
}     sz.push(root);while(!sz.empty()){double sum=0;int size=sz.size();for(int i=0;i<size;i++){TreeNode* node=sz.front();sz.pop();sum+=node->val;if(node->left)sz.push(node->left);if(node->right)sz.push(node->right);}az.push_back(sum/size);}return az;}
};

N叉树的层序遍历

这题就是跟第一题基本一样的,只不过节点多了几个孩子

class Solution {
public:vector<vector<int>> levelOrder(Node* root) {vector<vector<int>> az;queue<Node*> sz;if(root==nullptr){return az;}sz.push(root);while(!sz.empty()){vector<int> a;int size=sz.size();for(int i=0;i<size;i++){Node* node=sz.front();sz.pop();a.push_back(node->val);for(int i=0;i<node->children.size();i++){if(node->children[i])sz.push(node->children[i]);}}az.push_back(a);}return az;}
};

在每个树行中找最大值

class Solution {
public:vector<int> largestValues(TreeNode* root) {vector<int> az;queue<TreeNode*> sz;if(root==nullptr){return az;}sz.push(root);while(!sz.empty()){int size=sz.size();int max=INT_MIN;for(int i=0;i<size;i++){TreeNode* node=sz.front();sz.pop();max=max>node->val?max:node->val;if(node->left) sz.push(node->left);if(node->right)sz.push(node->right);}az.push_back(max);}return az;}
};

填充每个节点的下一个右侧节点指针

回想一下二叉树的层次遍历,用广度优先实现的时候,就是层层遍历,每层临时遍历的节点都会放到一个队列中。队列中保存了第 i 层节点的信息,我们利用这个特点,将队列中的元素都串联一遍就可以了。

class Solution {public Node connect(Node root) {if (root == null) {return root;}// 初始化队列同时将第一层节点加入队列中,即根节点Queue<Node> queue = new LinkedList<Node>(); queue.add(root);// 外层的 while 循环迭代的是层数while (!queue.isEmpty()) {// 记录当前队列大小int size = queue.size();// 遍历这一层的所有节点for (int i = 0; i < size; i++) {// 从队首取出元素Node node = queue.poll();// 连接if (i < size - 1) {node.next = queue.peek();}// 拓展下一层节点if (node.left != null) {queue.add(node.left);}if (node.right != null) {queue.add(node.right);}}}// 返回根节点return root;}
}

填充每个节点的下一个右侧节点指针II

和上题是完全一样的

class Solution {
public:Node* connect(Node* root) {if (root == nullptr) {return root;}// 初始化队列同时将第一层节点加入队列中,即根节点queue<Node*> Q;Q.push(root);// 外层的 while 循环迭代的是层数while (!Q.empty()) {// 记录当前队列大小int size = Q.size();// 遍历这一层的所有节点for(int i = 0; i < size; i++) {// 从队首取出元素Node* node = Q.front();Q.pop();// 连接if (i < size - 1) {node->next = Q.front();}// 拓展下一层节点if (node->left != nullptr) {Q.push(node->left);}if (node->right != nullptr) {Q.push(node->right);}}}// 返回根节点return root;}
};

二叉树的最大深度

这题前面有讲过, 可以参考这篇博客:力扣刷题之二叉树的最大深度_skeet follower的博客-CSDN博客

二叉树的最小深度

需要注意的是,只有当左右孩子都为空的时候,才说明遍历的最低点了。如果其中一个孩子为空则不是最低点

class Solution {
public:int minDepth(TreeNode* root) {queue<TreeNode*> az;if(root==nullptr){return 0;}int depth=0;az.push(root);while(!az.empty()){int size=az.size();depth++;for(int i=0;i<size;i++){TreeNode* node=az.front();az.pop();if(node->left) az.push(node->left);if(node->right)az.push(node->right);if(node->right==nullptr&&node->left==nullptr){return depth;}}}return depth;}
};

力扣刷题之二叉树的层序遍历相关推荐

  1. 《剑指Offer》力扣刷题笔记(03-10)

    <剑指Offer>力扣刷题笔记(03-10) 最近确实有点闲,想在进组搬砖之前找点有意义的事干,于是,就开始刷<剑指Offer>.<程序员面试金典>等书上的题目,也 ...

  2. 教你创建电脑、手机同步的markdown云笔记--力扣刷题力荐!

    开篇先致歉 其他不谈,开篇必须先给各位读者道个歉,年后工作上比较忙,加上最近闲暇的时间都用来在力扣上刷算法题了,导致公众号断更有些严重啊.再加上年后将健身减重提上了日程,时间上就更显的捉襟见肘了. 不 ...

  3. 『力扣刷题』5275_找出井字棋的获胜者 解题代码

    LeetCode-cn 力扣刷题 LeetCode-cn力扣刷题目录 165周赛 5275_找出井字棋的获胜者 * 5275. 找出井字棋的获胜者 显示英文描述* 用户通过次数0* 用户尝试次数0* ...

  4. 『力扣刷题』5276_不浪费原料的汉堡制作方案 解题代码

    LeetCode-cn 力扣刷题 LeetCode-cn力扣刷题目录 165周赛 5276_不浪费原料的汉堡制作方案 * 5276. 不浪费原料的汉堡制作方案 显示英文描述* 用户通过次数212* 用 ...

  5. 『力扣刷题』5238_找出给定方程的正整数解 解题代码

    html: embed_local_images: true embed_svg: true offline: true toc: undefined print_background: false ...

  6. 力扣刷题全局变量WA,局部变量AC的问题

    力扣刷题全局变量WA,局部变量AC问题 题目 原因 题目 golang力扣leetcode 1219.黄金矿工 原因 今天在刷题的时候,遇到一个现象,本地跑测试全部通过,一提交就错错错,非常离谱 然后 ...

  7. 力扣刷题pdf(java版本,内含暗黑版和光明版),都在这里了

    BAT大佬力扣刷题pdf,都在这里了! ​相信很多小伙伴刷题的时候面对力扣上近两千道题目,感觉无从下手! 我找了很久,今天终于让找到了Java版leetcode算法题解笔记,强烈建议先按照本篇介绍pd ...

  8. 力扣刷题-前k个高频元素

    力扣刷题-前k个高频元素 题目: 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素.你可以按 任意顺序 返回答案. 示例 1: 输入: nums = [1,1,1,2 ...

  9. 力扣刷题记录--哈希表相关题目

    当遇到需要快速判断一个元素是否出现在集合里面的时候,可以考虑哈希法,牺牲一定的空间换取查找的时间. java常用的哈希表有HashMap.HashSet以及用数组去模拟哈希,这几种方法各有优劣. 数组 ...

最新文章

  1. python实现卡方(Chi-Squared Test)相关性检验
  2. Vue之v-on绑定监听事件
  3. [译] Web 爬虫下的 Python 数据分析:中情局全球概况图解
  4. 为什么我建议你现在学Vue3?
  5. Visual Studio.net 2010 Windows Service 开发,安装与调试
  6. Swift中文教程(七) 闭包
  7. 接口规范 8. 播出认证相关接口
  8. 从RedHat到MongoDB,开源商业软件是如何占领世界的
  9. upc 7833 生日蛋糕
  10. 《思考,快与慢》读书笔记
  11. 240万!动漫人脸数据集AnimeCeleb
  12. 判断推理---逻辑判断
  13. 大学计算机应用基础绩点,出国留学如何计算GPA平均分
  14. babylonjs 分部加载模型_基于babylon3D模型研究3D骨骼动画(1)
  15. python逻辑量有_python逻辑运算符
  16. 计算机学硕一志愿仅录取一人,调剂录取几十人!重庆理工大学人工智能学院...
  17. VR数字沙盘高度还原未来房屋实景
  18. html字体颜色字号,(前端)html与css,css 5、颜色、字体、字号量取方式
  19. S3C2440的架构及启动方式
  20. 移动云物联网预研及阿里云开发对比分析

热门文章

  1. 永定城 × 奇点云 | 数字新商贸的全国样板长什么样?
  2. 一回生,二回熟,三回巧
  3. C# WPF 基于Socket的企业聊天软件IM(源码)
  4. preg_match详解
  5. python英汉互译 谷歌翻译 免费实现调用
  6. 2022年11月编程语言排行
  7. 面向对象程序设计php,php面向对象的程序设计
  8. 世界最具影响力的100个品牌
  9. c语言程序电子琴21个音符,14键电子琴曲谱_小电子琴有14个键音符怎么标
  10. img图片在webpack中使用