算法力扣刷题记录 四十【226.翻转二叉树】

前言

在这里插入图片描述
继续二叉树其余操作:
记录 四十【226.翻转二叉树】


一、题目阅读

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

示例 1:
在这里插入图片描述

输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]

示例 2:
在这里插入图片描述

输入:root = [2,1,3]
输出:[2,3,1]

示例 3:

输入:root = []
输出:[]

提示:

树中节点数目范围在 [0, 100] 内
-100 <= Node.val <= 100

二、尝试实现

思路

如何翻转:每个节点的左右孩子交换。确定用递归实现。
(1)确定参数和返回值:

  • 参数:根节点(整个树/某个子树)
  • 返回值void。直接用指针修改对象。无需返回值。

(2)确定终止条件:

  • 遇到叶子节点:没有左右孩子,可以return。
  • 遇到空节点:直接return。
  • if(!cur || cur->left == nullptr && cur->right == nullptr) return;

(3)逻辑:先深入到叶子节点,再交换操作。

  • 先走左边:递归cur->left。
  • 再走右边:递归cur->right。
  • 交换操作:如果左右孩子都有,互相交换;如果只有一边,换到另一边;

代码实现

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:void invertchild(TreeNode* cur){if(!cur || cur->left == nullptr && cur->right == nullptr){ //遇到空或叶子节点返回return;}invertchild(cur->left);invertchild(cur->right);//交换if(cur->left && cur->right){TreeNode* temp = cur->left;cur->left = cur->right;cur->right = temp;}else if(cur->left && !cur->right ){cur->right = cur->left;cur->left = nullptr;}else if(cur->right && !cur->left){cur->left = cur->right;cur->right = nullptr;}}TreeNode* invertTree(TreeNode* root) {invertchild(root);return root;}
};

参考思路

参考代码链接

学习内容

参考思路

中心思想:交换每个节点的左右孩子。所以不管是哪种遍历,得遍历到每一个节点。

  1. 法一——递归法:使用前序、后序遍历;交换操作直接用swap。结合二、的代码实现改变下。二、中的遍历方式——后序遍历。参考代码对应前序遍历。
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:TreeNode* invertTree(TreeNode* root) {if(root == nullptr) return root;invertTree(root->left);invertTree(root->right);swap(root->left,root->right);return root;}
};
  1. 法二——迭代法。用前序的迭代。
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:TreeNode* invertTree(TreeNode* root) {if(!root) return root;stack<TreeNode*> st;st.push(root);while(!st.empty()){TreeNode* cur = st.top();//中st.pop();swap(cur->left,cur->right);if(cur->right) st.push(cur->right);//先放右。交换之后的右是原来的左。下一轮先处理原来的右。if(cur->left) st.push(cur->left);//后放左。交换之后的左是原来的右。下一轮先处理这个,这是原来的右。}return root;}
};
  • 法三——统一迭代方式。
  • 法四——层序遍历。
    对比参考代码:参考:先swap,再push;
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:TreeNode* invertTree(TreeNode* root) {if(!root) return root;queue<TreeNode*> que;que.push(root);while(!que.empty()){int size = que.size();while(size--){TreeNode* cur = que.front();que.pop();if(cur->left) que.push(cur->left); //下一轮先处理原先的左子树。此时是交换之后的右子树。if(cur->right) que.push(cur->right);swap(cur->left,cur->right);}}return root;}
};

总结

翻转二叉树:遍历到每一个节点,交换左右孩子。

基础还是遍历方式。选择一种遍历方式即可。

(欢迎指正,转载标明出处)

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

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

相关文章

包管理器-npm、yarn、cnpm、pnpm的比较

1. npm (node package manage) 1.1本地安装 使用命令&#xff1a;npm install 包名 或 npm i 包名 本地安装的包出现在当前目录下的node_module目录中 如果本地安装的包带有CLI&#xff0c;npm 会将它的CLI脚本放置到node_modules/.bin下&#xff0c;使用npx命令即可调用。 …

Perl伪哈希探秘:深入理解Perl中的高级数据结构

&#x1f310; Perl伪哈希探秘&#xff1a;深入理解Perl中的高级数据结构 在Perl的世界里&#xff0c;数据结构是编程的基础。除了传统的数组和哈希&#xff0c;Perl还提供了一种特殊的数据结构——伪哈希&#xff08;Pseudo-Hashes&#xff09;。伪哈希是一种灵活的键值对集合…

Pandas 进阶 —— 数据转换、聚合与可视化

引言 在数据分析的旅程中&#xff0c;Pandas 库提供了从数据转换到聚合再到可视化的全面解决方案。上篇我们掌握了数据的导入和清洗&#xff0c;本篇我们将探索如何通过 Pandas 对数据进行更高级的处理&#xff0c;包括数据转换、聚合分析以及可视化展示。 数据转换 数据转换…

CAS介绍

CAS是计算机科学中的一个概念&#xff0c;全称是Compare-And-Swap&#xff08;比较并交换&#xff09;&#xff0c;它是一种原子操作&#xff0c;用于多线程环境下的同步机制。在Java中&#xff0c;你可以使用java.util.concurrent.atomic包下的类&#xff0c;如AtomicInteger来…

绝对值不等式运用(C++)

货仓选址 用数学公式表达题意&#xff0c;假设有位置a1~an,假设选址在x位置处&#xff0c;则有&#xff1a; 如何让这个最小&#xff0c;我们把两个式子整合一下&#xff0c;利用绝对值不等式&#xff1a; 我们知道&#xff1a; 如下图所示&#xff1a;到A&#xff0c;B两点&…

用python生成词频云图(python实例二十一)

目录 1.认识Python 2.环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3.词频云图 3.1 代码构思 3.2 代码实例 3.3 运行结果 4.总结 1.认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可读性&a…

云端美味:iCloud中食谱与餐饮计划的智能存储方案

云端美味&#xff1a;iCloud中食谱与餐饮计划的智能存储方案 在数字化生活管理中&#xff0c;我们的食谱和餐饮计划是日常饮食健康与乐趣的重要部分。iCloud提供了一个无缝的解决方案&#xff0c;让我们可以在所有设备上存储、同步和访问这些珍贵的信息。本文将详细介绍如何在…

[ICS] Inferno(地狱) ETH/IP未授权访问,远程控制工控设备利用工具

项目地址:https://github.com/MartinxMax/Inferno Inferno $ ./Install.sh $ python Inferno.py -h 模拟服务端 $ sudo python3 -m pip install --upgrade cpppo $ $ python -m cpppo.server.enip SCADAINT[1000] ADMININT[2] -v 创建一个EtherNet/IP设备 扫描设备 $ pyth…

QT--SQLite

配置类相关的表&#xff0c;所以我使用sqlite,且QT自带该组件&#xff1b; 1.安装 sqlite-tools-win-x64-3460000、SQLiteExpert5.4.31.575 使用SQLiteExpert建好数据库.db文件&#xff0c;和对应的表后把db文件放在指定目录 ./db/program.db&#xff1b; 2.选择sql组件 3.新…

YOLOv10改进 | Conv篇 | 全新的SOATA轻量化下采样操作ADown(参数量下降百分之二十,附手撕结构图)

一、本文介绍 本文给大家带来的改进机制是利用2024/02/21号最新发布的YOLOv9其中提出的ADown模块来改进我们的Conv模块&#xff0c;其中YOLOv9针对于这个模块并没有介绍&#xff0c;只是在其项目文件中用到了&#xff0c;我将其整理出来用于我们的YOLOv10的项目&#xff0c;经…

易备, 安全灵活的远程数据备份软件: 云备份、S3 备份、FTP 备份

面对勒索软件无处不在的威胁&#xff0c;企业都在寻求全方位的数据安全解决方案。其中&#xff0c;数据备份是这个方案的终极核心环节&#xff0c;因为勒索袭击的最终目标是数据&#xff0c;是袭击者用以勒索的筹码。 “不要把鸡蛋放在一个筐子里”&#xff0c;这个原则在备份…

【人工智能】-- 反向传播

个人主页&#xff1a;欢迎来到 Papicatch的博客 课设专栏 &#xff1a;学生成绩管理系统 专业知识专栏&#xff1a; 专业知识 文章目录 &#x1f349;引言 &#x1f349;反向传播 &#x1f348;定义 &#x1f348;反向传播的作用 &#x1f34d;参数优化 &#x1f34d;学…

Qt Creator仿Visual Studio黑色主题

转自本人博客&#xff1a;Qt Creator仿Visual Studio黑色主题 1.演示 配置文件和步骤在后面&#xff0c;先看成品&#xff0c;分别是QWidget和QML的代码编写界面&#xff1a; 2. 主题配置文件 下载链接&#xff1a;QtCreator _theme_VS_dark.xml 也可以自己新建一个xml文件&…

应对挑战:Transformer模型在不平衡数据集上的应用策略

应对挑战&#xff1a;Transformer模型在不平衡数据集上的应用策略 在机器学习领域&#xff0c;数据不平衡是一个常见问题&#xff0c;特别是在自然语言处理&#xff08;NLP&#xff09;任务中。Transformer模型&#xff0c;作为一种强大的序列处理模型&#xff0c;虽然在许多任…

C++常用排序拷贝替换算术生成集合运算算法总结

文章目录 1.常用排序算法1. sort2. random_shuffle3. merge4. reverse 2.常用拷贝和替换算法1. copy2. replace3. replace_if4. swap 3.常用算术生成算法1. accumulate2. fill 4.常用集合算法1. set_intersection2. set_union3. set_difference 1.常用排序算法 在C中&#xff…

【RHCE】转发服务器实验

1.在本地主机上操作 2.在客户端操作设置主机的IP地址为dns 3.测试,客户机是否能ping通

(pyqt5)弹窗-Token验证

前言 为了保护自己的工作成果,控制在合理的范围内使用,设计一个用于Token验证的弹窗. 代码 class TokenDialog(QDialog):def __init__(self, parentNone, login_userNone, mac_addrNone, funcNone):super(TokenDialog, self).__init__(parent)self.login_user login_userself…

手撸俄罗斯方块(五)——游戏主题

手撸俄罗斯方块&#xff08;五&#xff09;——游戏主题 当确定游戏载体&#xff08;如控制台&#xff09;后&#xff0c;界面将呈现出来。但是游戏的背景色、方块的颜色、方框颜色都应该支持扩展。 当前游戏也是如此&#xff0c;引入了 Theme 的概念&#xff0c;支持主题的扩…

Rust入门实战 编写Minecraft启动器#2建立资源模型

首发于Enaium的个人博客 我们需要声明几个结构体来存储游戏的资源信息&#xff0c;之后我们需要将json文件解析成这几个结构体&#xff0c;所以我们需要添加serde依赖。 serde { version "1.0", features ["derive"] }资源相关asset.rs use serde::De…

雨量监测站的重要性有哪些

在全球气候变化和极端天气事件频发的背景下&#xff0c;雨量监测站成为了我们理解降水模式、预测天气变化以及制定应对措施的重要工具。 雨量监测站是一种专门用于测量和记录降水量的设施。它们通过配备高精度的雨量传感器&#xff0c;能够实时监测降雨情况&#xff0c;并提供关…