LeetCode 刷题 -- Day 6

embedded/2024/9/23 9:43:30/

今日题目

题目难度备注
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/embedded/26111.html

相关文章

【Kotlin】Channel简介

1 前言 Channel 是一个并发安全的阻塞队列&#xff0c;可以通过 send 函数往队列中塞入数据&#xff0c;通过 receive 函数从队列中取出数据。 当队列被塞满时&#xff0c;send 函数将被挂起&#xff0c;直到队列有空闲缓存&#xff1b;当队列空闲时&#xff0c;receive 函数将…

CLIP论文笔记:Learning Transferable Visual Models From Natural Language Supervision

导语 会议&#xff1a;ICML 2021链接&#xff1a;https://proceedings.mlr.press/v139/radford21a/radford21a.pdf 当前的计算机视觉系统通常只能识别预先设定的对象类别&#xff0c;这限制了它们的广泛应用。为了突破这一局限&#xff0c;本文探索了一种新的学习方法&#x…

Java图搜索算法详解:探索图论中的奥秘

图搜索算法是图论领域的重要内容&#xff0c;它在解决各种实际问题中起着关键作用。本文将详细介绍几种常见的Java图搜索算法&#xff0c;包括深度优先搜索&#xff08;DFS&#xff09;、广度优先搜索&#xff08;BFS&#xff09;以及Dijkstra算法&#xff0c;帮助读者深入理解…

ES6之rest参数、扩展运算符

文章目录 前言一、rest参数二、扩展运算符 1.将数组转化为逗号分隔的参数序列2.应用总结 前言 rest参数与arguments变量相似。ES6引入rest参数代替arguments&#xff0c;获取函数实参。扩展运算符能将数组转化为参数序列。 一、rest参数 function namelist1() {console.log(ar…

Nginx从入门到精通

第一章> 1、概述 2、正反向代理 3、负载均衡 4、Nginx安装 第二章> 5、常用命令 6、实战总结 7、前端部署 ***************************************…

cartographer问题处理

问题1 : CMake Error: The following variables are used in this project, but they are set to NOTFOUND. Please set them or make sure they are set and tested correctly in the CMake files: GMOCK_LIBRARY (ADVANCED)linked by target "time_conversion_test&quo…

Android Studio的settings.gradle配置

pluginManagement { repositories { maven { url ‘https://maven.aliyun.com/nexus/content/groups/public/’} maven { url ‘https://maven.aliyun.com/nexus/content/repositories/gradle-plugin’} maven { url ‘https://maven.aliyun.com/nexus/content/repositories/ap…

Rust中的并发性:Sync 和 Send Traits

在并发的世界中&#xff0c;最常见的并发安全问题就是数据竞争&#xff0c;也就是两个线程同时对一个变量进行读写操作。但当你在 Safe Rust 中写出有数据竞争的代码时&#xff0c;编译器会直接拒绝编译。那么它是靠什么魔法做到的呢&#xff1f; 这就不得不谈 Send 和 Sync 这…