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

news2024/11/13 12:18:17

前言

在这里插入图片描述
继续二叉树其余操作:
记录 四十【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.coloradmin.cn/o/1916543.html

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

相关文章

Elasticsearch:使用 Filebeat 从 Node.js Web 应用程序提取日志

本指南演示了如何从 Node.js Web 应用程序中提取日志并将其安全地传送到 Elasticsearch Service 部署中。你将设置 Filebeat 来监控具有标准 Elastic Common Schema (ECS) 格式字段的 JSON 结构日志文件&#xff0c;然后在向 Node.js 服务器发出请求时&#xff0c;你将在 Kiban…

云开发技术的壁纸小程序源码,无需服务期无需域名

1、本款小程序为云开发版本&#xff0c;不需要服务器域名 2、文件内有图文搭建教程&#xff0c;小白也不用担心不会搭建。 3、本程序反应速度极快&#xff0c;拥有用户投稿、积分系统帮助各位老板更多盈利。 4、独家动态壁纸在线下载&#xff0c;给用户更多的选择 5、最新版套图…

“论基于构件的软件开发方法及其应用”精选范文,软考高级论文,系统架构设计师论文

论文真题 基于构作的软件开发 (Component-Based Software Development&#xff0c;CBSD) 是一种基于分布对象技术、强调通过可复用构件设计与构造软件系统的软件复用途径。基于构件的软件系统中的构件可以是COTS &#xff08;Commercial-Off-the-Shelf&#xff09;构件&#x…

“金山-讯飞”杯2024年武汉理工大学程序设计竞赛 A. Mobiusp败走***(思维题-点双连通分量、连通性)

题目 思路来源 官方题解 题解 手玩发现&#xff0c;能换的话&#xff0c;当且仅当.和1在一个环里&#xff0c;而这就是点双连通分量 所以最优策略是先把.换到(x,y)的位置&#xff0c;然后判断.和1在不在一个环里 也就是&#xff1a; 1. 判断删掉1时&#xff0c;.和(x,y)联…

Open3D 点云配准精度评价指标-RMSE

目录 一、概述 1.1RMSE的计算方法 1.2RMSE的评价标准 二、代码实现 三、实现效果 3.1原始点云 3.2计算数据 一、概述 均方根误差(RMSE, Root Mean Squared Error)是衡量两个点云之间平均误差的一个常用指标。它通过计算匹配点对之间距离的平方和的平方根,来…

Golang | Leetcode Golang题解之第227题基本计算器II

题目&#xff1a; 题解&#xff1a; func calculate(s string) (ans int) {stack : []int{}preSign : num : 0for i, ch : range s {isDigit : 0 < ch && ch < 9if isDigit {num num*10 int(ch-0)}if !isDigit && ch ! || i len(s)-1 {switch preS…

C++ | Leetcode C++题解之第227题基本计算器II

题目&#xff1a; 题解&#xff1a; class Solution { public:int calculate(string s) {vector<int> stk;char preSign ;int num 0;int n s.length();for (int i 0; i < n; i) {if (isdigit(s[i])) {num num * 10 int(s[i] - 0);}if (!isdigit(s[i]) &&am…

Linux文件:EXT2文件系统工作原理 软硬链接

Linux文件&#xff1a;文件系统究竟是什么&#xff1f;如何管理文件&#xff1f; 前言一、磁盘结构、存储策略1.1 磁盘存储结构1.2 磁盘存储策略1.3 磁盘的逻辑存储结构 二、如何管理磁盘文件三、如何管理组3.1 每个组保存的数据种类3.2 如何管理数据1、节点表&#xff08;inod…

CSS技巧专栏:一日一例 3.纯CSS实现炫酷多彩按钮特效

大家好,今天是 CSS技巧专栏:一日一例 第三篇《纯CSS实现炫酷多彩按钮特效》 先看图: 开工前的准备工作 正如昨日所讲,为了案例的表现,也处于书写的习惯,在今天的案例开工前,先把昨天的准备工作重做一遍。 清除浏览器的默认样式定义页面基本颜色设定body的样式清除butt…

LNMP搭建Discuz和Wordpress

1、LNMP L:linux操作系统 N&#xff1a;nginx展示前端页面web服务 M&#xff1a;mysql数据库&#xff0c;保存用户和密码&#xff0c;以及论坛相关的内容 P&#xff1a;php动态请求转发的中间件 数据库的作用&#xff1a; 登录时验证用户名和密码 创建用户和密码 发布和…

Groovy vs Kotlin 在Gradle配置文件中的差异与选择

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

思维+dfs+二染色,CF 1060E - Sergey and Subway

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1060E - Sergey and Subway 二、解题报告 1、思路分析 考虑修改后的图&#xff0c;任意两点间的距离有何变化&#xff1f; 除2向上取整 那么我们要求的就是Σ[d / 2] 直接求太慢了&#xff0c;考虑求每个…

GitHub 站点打不开

遇到的问题 您是否遇到过GitHub网站打不开的情况&#xff0c;正如下图所示&#xff1a; 解决方案 以下是一些常见的解决方案&#xff1a; 1. 检查网络连接 确保你的设备已连接到互联网。尝试访问其他网站&#xff0c;确保不是你的网络问题。 C:\Vinca>ping github.…

Html:点击图标/链接发起QQ临时会话

我们在做前端开发的时候&#xff0c;会遇到用户需要点击一个图标可以发起QQ临时会话&#xff0c;这样不用添加好友也能沟通的&#xff0c;那我们就来看看如何实现这个功能&#xff1a; <a href"http://wpa.qq.com/msgrd?v3&uin你的QQ号码&siteqq&menuyes…

10分钟赚66元

需求&#xff0c;未开通个人养老金&#xff0c;支付宝上绑定任意行一张银行卡 1&#xff1a;支付宝扫 第一张图 二维码开通个人养老金账户 选择工商银行 会得48元红包 2&#xff1a;个人账户存1元 得18元红包

Excel第29享:基于sum嵌套sumifs的多条件求和

1、需求描述 如下图所示&#xff0c;现要统计12.17-12.23这一周各个人员的“上班工时&#xff08;a1&#xff09;”。 下图为系统直接导出的工时数据明细样例。 2、解决思路 首先&#xff0c;确定逻辑&#xff1a;“对多个条件&#xff08;日期、人员&#xff09;进行“工时”…

Open3D 计算点云FPFH特征

目录 一、概述 1.1法线估计 1.2SPFH&#xff08;Simplified Point Feature Histograms&#xff09;计算 1.3FPFH计算 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 3.1原始点云 3.2计算数据 一、概述 FPFH&#xff08;Fast Point Feature Histogram&#xff0…

又是三道简单的web题(2)

一、cookie 1.打开后是如下页面&#xff0c;抓包&#xff0c;关注cookie 2.发现cookie中有一个文件 3.直接访问这个文件&#xff0c;得到flag 二、employeeswork 打开后页面如下&#xff1a; 点击后出现一串php代码 审一下这个代码&#xff0c;需要添加参数work并且赋值work…

若依vue集成electron实现打包exe应用程序

一、修改package.json文件,加入相关依赖和配置 {"name": "ruoyi","version": "3.8.6","description": "若依管理系统","author": "若依","license":

十、函数栈帧的创建和销毁

前期学习的时候我们可能会有很多困惑&#xff0c;如&#xff1a; &#xff08;1&#xff09;局部变量的值是随机值&#xff1f; &#xff08;2&#xff09;为什么局部变量的值是随机值&#xff1f; &#xff08;3&#xff09;函数是怎么传参的&#xff1f;传参的顺序是怎样的…