LeetCode 刷题 -- Day 6

ops/2024/11/14 20:10:00/

今日题目

题目难度备注
102. 二叉树的层序遍历 中等一招鲜吃遍天
107. 二叉树的层序遍历 II )中等
199. 二叉树的右视图 中等
637. 二叉树的层平均值简单
429. N 叉树的层序遍历中等
515. 在每个树行中找最大值中等
116. 填充每个节点的下一个右侧节点指针中等
104. 二叉树的最大深度 简单
111. 二叉树的最小深度简单

树篇Ⅰ -- 层次遍历

  • 今日题目
  • 题目:102. 二叉树的层序遍历
    • 一、源代码
    • 二、代码思路
  • 题目:107. 二叉树的层序遍历 II
    • 一、源代码
    • 二、代码思路
  • 题目:199. 二叉树的右视图
    • 一、源代码
    • 二、代码思路
  • 题目:637. 二叉树的层平均值
    • 一、源代码
    • 二、代码思路
  • 题目:429. N 叉树的层序遍历
    • 一、源代码
    • 二、代码思路
  • 题目:515. 在每个树行中找最大值
    • 一、源代码
  • 题目:116. 填充每个节点的下一个右侧节点指针
    • 一、源代码
    • 二、代码思路
  • 题目:104. 二叉树的最大深度
    • 一、源代码
    • 二、代码思路
  • 题目:111. 二叉树的最小深度
    • 一、源代码
    • 二、代码思路

题目:102. 二叉树的层序遍历

102. 二叉树的层序遍历 - 力扣(LeetCode)

一、源代码

class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int> > ans;if(root == nullptr){return ans;}queue<TreeNode*> q;q.push(root);while (!q.empty()) {                                    //层次遍历队列int n = q.size();vector<int> layer;while(n--) {                                       // 遍历每一层,将遍历的元素出队,并将下一层压入队列TreeNode* now = q.front();q.pop();layer.push_back(now->val);                     //存储每一层的结点值if (now->left) q.push(now->left);if (now->right) q.push(now->right);}ans.push_back(layer);layer.clear();}return ans;}
};

二、代码思路

利用 queue<TreeNode*> q 实现树的层次遍历。在遍历队列的过程中,利用while(q.size()–) 实现遍历每一层,将遍历的元素出队,并将下一层压入队列,最后就得到了各层结点值了。


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

107. 二叉树的层序遍历 II - 力扣(LeetCode)

一、源代码

class Solution {
public:vector<vector<int>> levelOrderBottom(TreeNode* root) {vector<vector<int>> ans;if (root == nullptr) {return ans;}queue<TreeNode*> q;q.push(root);while (!q.empty()) {                        // 层次遍历队列int n = q.size();vector<int> layer;while (n--) {                           // 遍历每一层,将遍历的元素出队,并将下一层压入队列TreeNode* now = q.front();q.pop();layer.push_back(now->val);          // 存储每一层的结点值if (now->left)q.push(now->left);if (now->right)q.push(now->right);}ans.push_back(layer);layer.clear();}reverse(ans.begin(),ans.end());             //反转层次遍历,得到自底向上的层次遍历return ans;}
};

二、代码思路

反转层次遍历,得到自底向上的层次遍历。官方也这样做,那就心安理得,直接下一题了咯。


题目:199. 二叉树的右视图

199. 二叉树的右视图 - 力扣(LeetCode)

一、源代码

class Solution {
public:vector<int> rightSideView(TreeNode* root) {vector<int> ans;if (root == nullptr) {return ans;}queue<TreeNode*> q;q.push(root);while (!q.empty()) {                                 // 层次遍历队列int n = q.size();while (n--) {                                    // 遍历每一层,将遍历的元素出队,并将下一层压入队列TreeNode* now = q.front();q.pop();if(n == 0)  ans.push_back(now->val);         // 将每层最后一个结点压入ans数组中if (now->left)  q.push(now->left);if (now->right) q.push(now->right);}}return ans;}
};

二、代码思路

层次遍历队列,将每层最后一个结点压入ans数组中(此时 n == 0)。


题目:637. 二叉树的层平均值

637. 二叉树的层平均值 - 力扣(LeetCode)

一、源代码

class Solution {
public:vector<int> rightSideView(TreeNode* root) {vector<double> ans;if (root == nullptr) {return ans;}queue<TreeNode*> q;q.push(root);while (!q.empty()) {                                  // 层次遍历队列int cnt = q.size(), n = cnt;double sum = 0;while (cnt--) {                                   // 遍历每一层,将遍历的元素出队,并将下一层压入队列TreeNode* now = q.front();q.pop();sum += now->val;                              // 统计每层结点值之和if (now->left)  q.push(now->left);if (now->right) q.push(now->right);}ans.push_back(sum / n);                           // 计算平均值并存入 ans 数组}return ans;}
};

二、代码思路

层次遍历队列,统计每层结点值之和,最后计算平均值并存入 ans数组。


题目:429. N 叉树的层序遍历

429. N 叉树的层序遍历 - 力扣(LeetCode)

一、源代码

class Solution {
public:vector<vector<int>> levelOrder(Node* root) {vector<vector<int>> ans;if (root == nullptr) {return ans;}queue<Node*> q;q.push(root);while (!q.empty()) {                           // 层次遍历队列int n = q.size();vector<int> layer;while (n--) {                             // 遍历每一层,将遍历的元素出队,并将下一层压入队列Node* now = q.front();q.pop();layer.push_back(now->val);            // 存储每一层的结点值for (int i = 0; i < now->children.size(); i++) {q.push(now->children[i]);}}ans.push_back(layer);layer.clear();}return ans;}
};

二、代码思路

利用 queue<Node*> q 实现树的层次遍历。在遍历队列的过程中,利用while(q.size()–) 实现遍历每一层,将遍历的元素出队,并将下一层压入队列,最后就得到了各层结点值了。


题目:515. 在每个树行中找最大值

515. 在每个树行中找最大值 - 力扣(LeetCode)

一、源代码

class Solution {
public:vector<int> largestValues(TreeNode* root) {vector<int> ans;if (root == nullptr) {return ans;}queue<TreeNode*> q;q.push(root);while (!q.empty()) {                       // 层次遍历队列int cnt = q.size(), n = cnt;int maxVal = INT_MIN;while (cnt--) {                      // 遍历每一层,将遍历的元素出队,并将下一层压入队列TreeNode* now = q.front();q.pop();if (now->val > maxVal) maxVal = now->val;if (now->left)  q.push(now->left);if (now->right) q.push(now->right);}ans.push_back(maxVal);}return ans;}
};

题目:116. 填充每个节点的下一个右侧节点指针

116. 填充每个节点的下一个右侧节点指针 - 力扣(LeetCode)

一、源代码

class Solution {
public:Node* connect(Node* root) {if (root == nullptr) {return root;}queue<Node*> q;q.push(root);while (!q.empty()) {               // 层次遍历队列int cnt = q.size();while (cnt--) {                // 遍历每一层,将遍历的元素出队,并将下一层压入队列Node* now = q.front();q.pop();if (cnt > 0) {             // 连接now->next = q.front();}if (now->left)q.push(now->left);if (now->right)q.push(now->right);}}return root;}
};

二、代码思路

初始状态下,所有 next 指针都被设置为 NULL。所以只要层次遍历树,在每层中进行连接就行。


题目:104. 二叉树的最大深度

104. 二叉树的最大深度 - 力扣(LeetCode)

一、源代码

class Solution {
private:int DFS(TreeNode* root,int h) {if (!root) return h;int l = DFS(root->left,h+1);int r = DFS(root->right,h+1);return l > r ? l : r;}
public:int maxDepth(TreeNode* root) {return DFS(root,0);}
};

二、代码思路

利用递归,每次递归处理一层中的一个结点。对每一层的一个结点有两种情况:

① root 为空指针,则说明递归到底,返回 高度h 就行。

② root 不为空,则找它的左右孩子的高度,并返回较大的高度 h。

对树顶点开始执行递归就得到了最大高度。


题目:111. 二叉树的最小深度

111. 二叉树的最小深度 - 力扣(LeetCode)

一、源代码

class Solution {
private:int minH = INT_MAX;void DFS(TreeNode* root, int h) {if (!root)return ;if (!root->left && !root->right) {        // 遇到叶子结点则更新 minHminH = min(minH,h+1);}DFS(root->left,h+1);DFS(root->right,h+1);}public:int minDepth(TreeNode* root) {DFS(root,0);return root ? minH : 0;                  // 为空指针返回 0,否则返回 minH}
};

二、代码思路

DFS 遍历树,且每下一层高度 h+1,当访问到叶子结点时,就得出了一条从根节点到最近叶子结点的路径长度了(为当前h+1),记录最小的路径长度即为答案


http://www.ppmy.cn/ops/22722.html

相关文章

C语言 | Leetcode C语言题解之第55题跳跃游戏

题目&#xff1a; 题解&#xff1a; #define max(a, b) (((a) > (b)) ? (a) : (b))bool canJump(int* nums, int numsSize){int cover 0;int i;// 只可能获取cover范围中的步数&#xff0c;所以i<coverfor(i 0; i < cover; i) {// 更新cover为从i出发能到达的最大…

flutter开发实战-混淆minifyEnabled及shrinkResources

flutter开发实战-混淆minifyEnabled及shrinkResources 最近开发中&#xff0c;出现了在Debug模式下完全正常&#xff0c;打包build后出现插件代码调用提示未实现。 No implementation found for method login on channel app_plugin 经过查找发现在build apk时候出现了混淆的问…

如何利用 GPT 自我提高写作能力

GPT革命&#xff1a;如何用AI技术重新定义写作 介绍 在我们的数字时代&#xff0c;了解自我提高写作的必要性至关重要。 随着 GPT 的兴起&#xff0c;我们正在见证书写的变革时代。 这篇扩展文章深入探讨了 GPT 如何显着提高写作技能。 拥抱未来&#xff1a; 人工智能时代的写…

C++中的数据结构与算法

随处可见的红黑树 一般会用到[key,value]。 例如github中这个例子&#xff0c;第一个是访问网站&#xff0c;第二个是访问次数&#xff0c;但是这个不是静态的&#xff0c;这有个动态排序&#xff0c;并且当我们需要让相应的访问次数加1的时候&#xff0c;我们用红黑树查找的时…

理解原型和原型链

当你理解JavaScript中的原型和原型链&#xff0c;你就能理解为什么JavaScript中一切皆对象&#xff0c;以及为什么函数也是对象。让我帮你梳理一下。 原型 (Prototype) 在JavaScript中&#xff0c;每个对象都有一个原型对象&#xff08;prototype&#xff09;。当你创建一个对…

Matlab实现CNN-LSTM模型,对一维时序信号进行分类

1、利用Matlab2021b训练CNN-LSTM模型&#xff0c;对采集的一维时序信号进行分类二分类或多分类 2、CNN-LSTM时序信号多分类执行结果截图 训练进度&#xff1a; 网络分析&#xff1a; 指标变化趋势&#xff1a; 代码下载方式&#xff08;代码含数据集与模型构建&#xff0c;附…

Quarto Dashboards 教程 3:Dashboard Data Display

「写在前面」 学习一个软件最好的方法就是啃它的官方文档。本着自己学习、分享他人的态度&#xff0c;分享官方文档的中文教程。软件可能随时更新&#xff0c;建议配合官方文档一起阅读。推荐先按顺序阅读往期内容&#xff1a; 1.quarto 教程 1&#xff1a;Hello, Quarto 2.qu…

18.Nacos配置管理-微服务读取Nacos中的配置

需要解决的问题 1.实现配置更改热更新&#xff0c;而不是改动了配置文件还要去重启服务才能生效。 2.对多个微服务的配置文件统一集中管理。而不是需要对每个微服务逐一去修改配置文件&#xff0c;特别是公共通用的配置。 配置管理服务中的配置发生改变后&#xff0c;回去立…