代码随想录刷题题Day12

刷题的第十二天,希望自己能够不断坚持下去,迎来蜕变。😀😀😀
刷题语言:C++
Day12 任务
● 层序遍历 10
● 226.翻转二叉树
● 101.对称二叉树 2

1 层序遍历

一口气做十题
102.二叉树的层序遍历
107.二叉树的层次遍历II
199.二叉树的右视图
637.二叉树的层平均值
429.N叉树的层序遍历
515.在每个树行中找最大值
116.填充每个节点的下一个右侧节点指针
117.填充每个节点的下一个右侧节点指针II
104.二叉树的最大深度
111.二叉树的最小深度

层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。
队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑

在这里插入图片描述
102.二叉树的层序遍历
在这里插入图片描述

层序遍历模板:
C++:

class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> result;queue<TreeNode*> que;if (root != NULL) que.push(root);while (!que.empty()){int size = que.size();vector<int> vec;// 这里一定要使用固定大小size,不要使用que.size()while (size--){TreeNode* node = que.front();que.pop();vec.push_back(node->val);if (node->left) que.push(node->left);if (node->right) que.push(node->right);}result.push_back(vec);}return result;}
};

107.二叉树的层次遍历II
在这里插入图片描述

思路:

把result数组反转一下

C++:

class Solution {
public:vector<vector<int>> levelOrderBottom(TreeNode* root) {queue<TreeNode*> que;vector<vector<int>> result;if (root != NULL) que.push(root);while (!que.empty()){int size = que.size();vector<int> vec;while (size--){TreeNode* node = que.front();que.pop();vec.push_back(node->val);if (node->left) que.push(node->left);if (node->right) que.push(node->right);}result.push_back(vec);}reverse(result.begin(), result.end());// 在这里反转一下数组return result;}
};

199.二叉树的右视图
在这里插入图片描述
思路:

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

C++:

class Solution {
public:vector<int> rightSideView(TreeNode* root) {queue<TreeNode*> que;vector<int> result;if (root != NULL) que.push(root);while (!que.empty()){int size = que.size();for (int i = 0; i < size; i++){TreeNode* node = que.front();que.pop();if (i == (size - 1)) result.push_back(node->val);// 将每一层的最后元素放入result数组if (node->left) que.push(node->left);if (node->right) que.push(node->right);}}return result;}
};

637.二叉树的层平均值
在这里插入图片描述
思路:

层序遍历的时候把一层求个总和在取一个均值

C++:

class Solution {
public:vector<double> averageOfLevels(TreeNode* root) {queue<TreeNode*> que;vector<double> result;if (root != NULL) que.push(root);while (!que.empty()){double sum = 0;// 统计每一层的和int size = que.size();for (int i = 0; i < size; i++){TreeNode* node = que.front();que.pop();sum += node->val;if (node->left) que.push(node->left);if (node->right) que.push(node->right);}result.push_back(sum / size);// 将每一层均值放进结果}return result;}
};

429.N叉树的层序遍历
在这里插入图片描述
思路:

一个节点有多个孩子,用for循环

C++:

class Solution {
public:vector<vector<int>> levelOrder(Node* root) {queue<Node*> que;vector<vector<int>> result;if (root != NULL) que.push(root);while (!que.empty()){int size = que.size();vector<int> vec;while (size--){Node* node = que.front();que.pop();vec.push_back(node->val);for (int i = 0; i < node->children.size(); i++)// 将节点孩子加入队列{if (node->children[i]) que.push(node->children[i]);}}result.push_back(vec);}return result;}
};

515.在每个树行中找最大值
在这里插入图片描述
思路:

层序遍历,取每一层的最大值

C++:

class Solution {
public:vector<int> largestValues(TreeNode* root) {queue<TreeNode*> que;vector<int> result;if (root != NULL) que.push(root);while (!que.empty()){int size = que.size();int maxValue = INT_MIN;// 取每一层的最大值for (int i = 0; i < size; i++){TreeNode* node = que.front();que.pop();maxValue = node->val > maxValue ? node->val : maxValue;if (node->left) que.push(node->left);if (node->right) que.push(node->right);}result.push_back(maxValue);// 把最大值放进数组}return result;}
};
class Solution {
public:vector<int> largestValues(TreeNode* root) {queue<TreeNode*> que;vector<int> result;if (root != NULL) que.push(root);while (!que.empty()){int size = que.size();vector<int> vec;for (int i = 0; i < size; i++){TreeNode* node = que.front();que.pop();vec.push_back(node->val);if (node->left) que.push(node->left);if (node->right) que.push(node->right);}auto MAX = max_element(vec.begin(), vec.end());result.push_back(*MAX);}return result;}
};

116.填充每个节点的下一个右侧节点指针
在这里插入图片描述
思路:

在单层遍历的时候记录一下本层的头部节点,然后在遍历的时候让前一个节点指向本节点

C++:

class Solution {
public:Node* connect(Node* root) {queue<Node*> que;if (root != NULL) que.push(root);while (!que.empty()){int size = que.size();Node* node;Node* nodePre;for (int i = 0; i < size; i++){if (i == 0) {nodePre = que.front();// 取出一层的头结点que.pop();node = nodePre;}else {node = que.front();que.pop();nodePre->next = node;// 本层前一个节点next指向本节点nodePre = nodePre->next;}if (node->left) que.push(node->left);if (node->right) que.push(node->right);}nodePre->next = NULL;// 本层最后一个节点指向NULL}return root;}
};

117.填充每个节点的下一个右侧节点指针II
在这里插入图片描述
思路:

和上个题目一样

C++:

class Solution {
public:Node* connect(Node* root) {queue<Node*> que;if (root != NULL) que.push(root);while (!que.empty()){int size = que.size();Node* node;Node* nodePre;for (int i = 0; i < size; i++){if (i == 0) {nodePre = que.front();// 取出一层的头结点que.pop();node = nodePre;}else {node = que.front();que.pop();nodePre->next = node;// 本层前一个节点next指向本节点nodePre = nodePre->next;}if (node->left) que.push(node->left);if (node->right) que.push(node->right);}nodePre->next = NULL;// 本层最后一个节点指向NULL}return root;}
};

104.二叉树的最大深度
在这里插入图片描述
思路:

使用层序遍历是最为合适的,因为最大的深度就是二叉树的层数。在二叉树中,一层一层的来遍历二叉树,记录一下遍历的层数就是二叉树的深度
在这里插入图片描述

C++:

class Solution {
public:int maxDepth(TreeNode* root) {queue<TreeNode*> que;int depth = 0;if (root != NULL) que.push(root);while (!que.empty()){int size = que.size();depth++;// 记录深度while (size--){TreeNode* node = que.front();que.pop();if (node->left) que.push(node->left);if (node->right) que.push(node->right);}}return depth;}
};

111.二叉树的最小深度
在这里插入图片描述
思路:

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

C++:

class Solution {
public:int minDepth(TreeNode* root) {int depth = 0;queue<TreeNode*> que;if (root == NULL) return 0;else que.push(root);while (!que.empty()){int size = que.size();depth++;// 记录最小深度for (int i = 0; i < size; i++){TreeNode* node = que.front();que.pop();if (node->left) que.push(node->left);if (node->right) que.push(node->right);// 当左右孩子都为空的时候,说明是最低点的一层if (!node->left && !node->right) return depth;}}return depth;}
};

2 翻转二叉树

在这里插入图片描述
思路:
在这里插入图片描述

把每一个节点的左右孩子交换一下。注意只要把每一个节点的左右孩子翻转一下,就可以达到整体翻转的效果

递归法:
在这里插入图片描述
(1)确定递归函数的参数和返回值

参数:要传入节点的指针
返回值:其实也不需要,但是题目中给出的要返回root节点的指针,可以直接使用题目定义好的函数,所以就函数的返回类型为TreeNode*

TreeNode* invertTree(TreeNode* root)

(2)确定终止条件

if (root == NULL) return root;

(3)确定单层递归的逻辑
前序遍历:中 左 右

swap(root->left, root->right);
invert(root->left);
invert(root->right);

中序遍历:左 中 右

invert(root->left);
swap(root->left, root->right);
invert(root->left);

后序遍历:左 右 中

invert(root->left);
invert(root->right);
swap(root->left, root->right);

针对二叉树的问题,解题之前一定要想清楚究竟是前中后序遍历,还是层序遍历

C++:

class Solution {
public:TreeNode* invertTree(TreeNode* root) {if (root == NULL) return root;swap(root->left, root->right); // 中invertTree(root->left);        // 左invertTree(root->right);       // 右return root;}
};

迭代法:
深度优先遍历
C++:

class Solution {
public:TreeNode* invertTree(TreeNode* root) {if(root == NULL) return root;stack<TreeNode*> st;st.push(root);while (!st.empty()){TreeNode* node = st.top();// 中st.pop();swap(node->left, node->right);if (node->right) st.push(node->right);// 右if (node->left) st.push(node->left);// 左}return root;}
};

广度优先遍历

层数遍历也是可以翻转这棵树的,因为层序遍历也可以把每个节点的左右孩子都翻转一遍

C++:

class Solution {
public:TreeNode* invertTree(TreeNode* root) {queue<TreeNode*> que;if (root != NULL) que.push(root);while (!que.empty()){int size = que.size();while (size--){TreeNode* node = que.front();que.pop();swap(node->left, node->right);// 节点处理if (node->left) que.push(node->left);if (node->right) que.push(node->right);}}return root;}
};

3 对称二叉树

在这里插入图片描述
思路:

比较的是根节点的左子树与右子树是不是相互翻转的,比较的是两个树(这两个树是根节点的左右子树),所以在递归遍历的过程中,也是要同时遍历两棵树。

在这里插入图片描述
比较的是两个子树的里侧和外侧的元素是否相等
遍历顺序只能是后序遍历,因为要通过递归函数的返回值来判断两个子树的内侧节点和外侧节点是否相等。
因为要遍历两棵树而且要比较内侧和外侧节点,所以准确的来说是一个树的遍历顺序是左右中,一个树的遍历顺序是右左中
递归法:
(1)确定递归函数的参数和返回值
比较的是根节点的两个子树是否是相互翻转的,进而判断这个树是不是对称树,所以要比较的是两个树,参数自然也是左子树节点和右子树节点
返回值自然是bool类型

bool compare(TreeNode* left, TreeNode* right)

(2)确定终止条件
要比较两个节点数值相不相同,首先要把两个节点为空的情况弄清楚!否则后面比较数值的时候就会操作空指针了

  1. 左节点为空,右节点不为空,不对称,return false
  2. 左不为空,右为空,不对称 return false
  3. 左右都为空,对称,返回true
  4. 左右都不为空,比较节点数值,不相同就return false
if (left == NULL && right != NULL) return false;
else if (left != NULL && right == NULL) return false;
else if (left == NULL && right == NULL) return true;
else if (left->val != right->val) return false; 

(3)确定单层递归的逻辑
处理 左右节点都不为空,且数值相同的情况

  1. 比较二叉树外侧是否对称:传入的是左节点的左孩子,右节点的右孩子。
  2. 比较内侧是否对称,传入左节点的右孩子,右节点的左孩子。
  3. 如果左右都对称就返回true ,有一侧不对称就返回false 。
bool outside = compare(left->left, right->right); // 左子树:左、 右子树:右
bool inside = compare(left->right, right->left);// 左子树:右、 右子树:左
bool result = outside && inside;// 左子树:中、 右子树:中
return result;

C++:

class Solution {
public:bool compare(TreeNode* left, TreeNode* right){// 首先排除空节点的情况if (left == NULL && right != NULL) return false;else if (left != NULL && right == NULL) return false;else if (left == NULL && right == NULL) return true;// 排除了空节点,再排除数值不相同的情况else if (left->val != right->val) return false;// 此时就是:左右节点都不为空,且数值相同的情况// 此时才做递归,做下一层的判断bool outside = compare(left->left, right->right);bool inside = compare(left->right, right->left);bool result = outside && inside;return result;}bool isSymmetric(TreeNode* root) {if (root == NULL) return true;return compare(root->left, root->right);}
};

鼓励坚持十三天的自己😀😀😀

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/220442.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字化管理系统:引领企业智能化时代

随着数字化和智能化的风潮席卷而来&#xff0c;企业数字化管理系统成为提升竞争力、提高效率的不可或缺的工具。在服装管理系统、仓储管理系统等方面应用的RFID技术和数字大屏更是为企业带来了前所未有的便利和优势。 数字化管理系统的重要性&#xff1a; 数字化管理系统是企…

oracle数据恢复—Oracle报错“system01.dbf需要更多的恢复来保持一致性”的数据恢复案例

oracle数据库恢复环境&故障&#xff1a; 一台Windows server操作系统的服务器上部署Oracle数据库。 服务器意外断电导致oracle数据库报错&#xff0c;报错信息&#xff1a;“system01.dbf需要更多的恢复来保持一致性”。由于该oracle数据库并没有备份&#xff0c;仅有一些断…

算法通关村第十三关—数字与数学高频问题(白银)

数字与数学高频问题 一、数组实现加法专题 1.1 数组实现整数加法 先看一个用数组实现逐个加一的问题。LeetCode66.具体要求是由整数组成的非空数组所表示的非负整数&#xff0c;在其基础上加一。这里最高位数字存放在数组的首位&#xff0c;数组中每个元素只存储单个数字。并且…

数据库传奇:MySQL创世之父的两千金My、Maria

《数据库传奇&#xff1a;MySQL创世之父的两千金My、Maria》 一、前言 MySQL是一款备受欢迎的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;最初由瑞典公司MySQL AB开发&#xff0c;目前隶属于Oracle Corporation。在DB-Engines的排名中&#xff0c;MySQL稳…

DevOps搭建(十)-安装Harbor镜像仓库详细步骤

1、下载Harbor 官方地址: https://goharbor.io/ 下载地址: https://github.com/goharbor/harbor/tags 选择文档版本进行下载,这里我们选择v2.7.2版本 2、上传到服务器并解压 上传压缩包到服务器后,解压到/usr/local目录下,执行以下解压命令 tar -zxvf harbor-offli…

一种可以实时监测蒸发量QY-ZF/F水面蒸发传感器

一种可以实时监测蒸发量QY-ZF/F水面蒸发传感器产品概述 本产品采取双层不锈钢结构设计&#xff0c;可以防止太阳直晒引起的蒸发误差。 清易QY-ZF/F水面蒸发传感器是一款用来观测水面蒸发的仪器&#xff0c;具有精度高、灵敏度高、量程宽等优势&#xff0c;可以快速地测量出单…

软信天成:企业数据目录加速数据资产管理智能化升级

随着数字时代的来临&#xff0c;数据的作用日益凸显&#xff0c;数字化能有效提高企业的运作效率。据调查统计, 数据领先型企业的指标比数据感知型企业领先50%左右。各界对数据治理的关注度逐年攀升&#xff0c;并且呈现经济越发达&#xff0c;越重视数据治理的态势。越来越多的…

安装ubuntu虚拟机并连接xShell+安装MySQL

网盘地址 链接&#xff1a;https://pan.baidu.com/s/1r-Je09AJrZcmbPYnCI6rfA?pwdk22h 提取码&#xff1a;k22h 安装 打开Vmware 一直下一步就行了 xshell连接 打开虚拟机&#xff0c;右键进入Terminal终端&#xff0c; 只复制opubuntu:~$后面的语句&#xff0c;前面op代…

加载离线镜像包:在线镜像离线为tar包、tar离线镜像包加载并根据imageId打tag

第一步&#xff1a;在线环境压缩离线镜像&#xff1a; 需要两个文件&#xff0c;第一个是脚本文件image_offline_load.sh脚本&#xff0c;第二个是image_list.txt 按行 存放需要离线的镜像名称 ./image_offline_load.sh save image_list.txt output.tar第二步&#xff1a;在离…

Python环境——conda环境切换 在特定环境下安装依赖

如下图所示 使用的命令 列出所有环境 conda env list激活特定环境 conda activate pytorch在该环境下安装 pip install tabulate

字符选择的题解

目录 原题描述&#xff1a; 题目描述 样例输入1 样例输出1 样例输入2 样例输出2 题目大意&#xff1a; 主要思路&#xff1a; change的设计&#xff1a; dp的转移&#xff1a; dp初始化&#xff1a; dp的结算&#xff1a; 注意事项&#xff1a; 代码&#xff08;有…

linux下部署东方通

第一步&#xff1a;安装jdk&#xff0c;此处不做过多介绍 第二步&#xff1a;东方通安装 1、下载东方通&#xff0c;建议去官网进行下载压缩包&#xff0c;同时下载授权文件&#xff01; 2、将压缩包上传至linux相对目录下进行解压 unzip Install_TW6.1.5.8_Enterprise_Lin…

计算机操作系统-第十五天

目录 线程的状态与转换 线程的组织与控制 本节思维导图 线程的状态与转换 线程的状态转换与进程的状态转换是一样的 线程的组织与控制 进程的控制块叫做PCB&#xff0c;线程的控制块叫做TCB 堆栈指针可以找到线程的堆栈在内存中的哪个位置&#xff0c;所以不需要保存堆栈…

Android多进程和跨进程通讯方式

前言 我们经常开发过程中经常会听到线程和进程&#xff0c;在讲述Android进程多进程前我打算先简单梳理一下这俩者。 了解什么是进程与线程 进程&#xff1a; 系统中正在运行的一个应用程序&#xff0c;某个程序一旦运行就是一个进程&#xff0c;是资源分配的最小单位&#…

SAP ABAP给销售订单添加抬头、行项目文本

SAP ABAP给销售订单添加抬头、行项目文本 第一步&#xff1a;创建文本ID 1&#xff0c;通过SE75&#xff0c;新键文本对象的文本ID 2&#xff0c;2 &#xff0c;找到对象VBBK 销售 标题文件 3&#xff0c;点击文本IDS 4&#xff0c;进去后新建文本ID 第二步&#xff1a;通过…

使用Visual Studio(VS)创建空项目的Win32桌面应用程序【main函数入口变WinMain】

前言 在Visual Studio中直接新建Windows桌面应用程序会有很多多余的代码生成&#xff0c;本文将提供从空项目创建Win32项目的方法&#xff0c;解决新建空项目直接使用WinMain代码编译报错的问题 例如&#xff1a;LNK2019 &#xff1a;无法解析的外部符号 参考博客&#xff1…

ChibiOS简介4/5

ChibiOS简介4/5 1. 源由2. ChibiOS基础知识4/52.13 Chapter 13 - RT Synchronous Messages2.13.1 Basic concepts2.13.2 APIs 2.14 Chapter 14 - RT Events2.14.1 Basic concepts2.14.1.1 Events2.14.1.2 Operations 2.14.2 APIs 2.15 Chapter 15 - RT Debug2.15.1 Compile Tim…

without explicit opt-in, is unsupported. Switch Maven repository ‘maven8

Using insecure protocols with repositories, without explicit opt-in, is unsupported. Switch Maven repository maven8 大概意思是 不支持对存储库使用不安全的协议.看下maven库&#xff0c;把http开头的改成https就好了。

B站武sir-django教程(1)

day15 初识Django Python知识点&#xff1a;函数、面向对象。前端开发&#xff1a;HTML、CSS、JavaScript、jQuery、BootStrap。MySQL数据库。Python的Web框架&#xff1a; Flask&#xff0c;自身短小精悍 第三方组件。Django&#xff0c;内部已集成了很多组件 第三方组件。…

Restormer技术点小结

1. 解决cnn的不足&#xff1a; 1&#xff09;感受野有限 2&#xff09;输入尺寸固定 2. 解决transform的不足&#xff1a; 1&#xff09;计算复杂度随着空间分辨率的增加而二次增长 3. 优势结构&#xff1a;MDTA(Multi-Dconv Head Transposed Attention)和GDFN( Gated-Dco…