算法练习第15天|226.翻转二叉树

226.翻转二叉树

力扣链接icon-default.png?t=N7T8https://leetcode.cn/problems/invert-binary-tree/description/

题目描述:

给你一棵二叉树的根节点 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 = []
输出:[]

 思路分析:

翻转二叉树,其实就把每一个节点的左右孩子交换一下就可以了。注意,是每一个节点的左右子节点。这就可以用到前面所将的二叉树递归遍历和层序遍历。下面分别使用前序递归,后序递归和层序遍历来实现。

前序递归实现:

先回顾一下递归三部曲:

1. 确定递归函数参数及返回值

2. 确定递归终止条件

3. 确定单层递归的逻辑操作有哪些

首先,对于函数参数,由于要遍历二叉树,所以要有一个TreeNode*指针来接收根节点,由于不需要对元素提取或其他操作,所以不再需要其他参数。其次,由于题目要求返回翻转后的根节点,所以返回值类型为TreeNode*。

TreeNode* invertTree(TreeNode* root)

第二,递归何时终止?当遇到要遍历的节点的指针为nullptr时,遍历终止。这里的root不仅表示根节点,还可以表示遍历过程中左右子树对应的根节点。

if (root == NULL) return root;

第三,单层递归要做哪些操作?前序遍历首先就要交换左右子节点,然后递归调用本函数分别对左右子树进行同样的操作,然后返回root。

swap(root->left, root->right);
invertTree(root->left);
invertTree(root->right);
return root;

整体代码如下: 

/*** 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;//第三步:确认单层递归的逻辑//前序遍历swap(root->left, root->right);  //中,交换invertTree(root->left);         //左,递归invertTree(root->right);        //右,递归return root;}
};

后序递归实现:

/*** 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;}
};

中序递归实现:需要注意左中右的右对应的指针

class Solution {
public:TreeNode* invertTree(TreeNode* root) {if (root == NULL) return root;invertTree(root->left);         // 左swap(root->left, root->right);  // 中invertTree(root->left);         // 注意 这里依然要遍历左孩子,因为中间节点已经翻转了return root;}
};

层序遍历实现:

class Solution {
public://层序遍历需要借助队列queueTreeNode* invertTree(TreeNode* root) {queue<TreeNode *> que;if(root != nullptr) que.push(root);elsereturn root;while(!que.empty()){int size = que.size();for(int i =0; i<size; i++){TreeNode * node = que.front();//注意,先交换,再入队左右子节点。否则会先遍历右节点                swap(node->left, node->right);if(node->left) que.push(node->left);if(node->right) que.push(node->right);    que.pop();}}return root;}
};

本人在写代码的时候,曾经多给交换前加了个条件,即

//注意,先交换,再入队左右子节点。否则会先遍历右节点
if(node->left!=nullptr && node->right != nullptr)swap(node->left, node->right);

想的是当前节点的左右节点均存在时才进行交换,但是程序未通过:

错误原因是,程序要实现的代码时即使左右子节点未能同时存在,也能完成交换(和nullptr)交换。如下图所示:

 所以这个加上的前提条件是不正确的,因此需要删除。

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

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

相关文章

关于无人机,你必须知道的事!!(科技篇)

飞行器的五脏六腑 电机&#xff1a;无人机的动力单元&#xff0c;俗称“马达”。通过电机转动来驱动螺旋桨旋转&#xff0c;最终让飞机上天。 电调&#xff1a;无人机的动力单元&#xff0c;是接收油门信号并调整电机转速的控制枢纽&#xff0c;俗称电机的“黑屋调教师” 飞…

探索计算机的小数世界:从二进制到无限精度

前言 不知道你是否和我一样&#xff0c;遇到这个情况。在刚开始学习编程。计算0.3-0.20.1这个小学都知道&#xff0c;但是如果你在计算机执行&#xff0c;发现结果并不是0.1 。这个时候会疑问到底是为什么呢。 System.out.println("0.3-0.2"(0.3-0.2)); 0.3-0.20.09…

Linux中home、var、opt、data、swap、根目录空间怎么分配

#Linux中home、var、opt、data、swap、根目录空间怎么分配 在Linux系统中&#xff0c;/home、/var、/opt和/data是几个常见的目录&#xff0c;它们通常用于存储不同类型的文件和数据。合理分配这些目录的空间对于系统的性能和数据管理非常重要。以下是一些关于如何分配这些目录…

算法基础--时间/空间复杂度

目录 前言一、时间复杂度1.1 时间复杂度公式1.2 常见的时间复杂度量级1.3 时间复杂度量级示例1.3.1 常数阶O(1)1.3.2 对数阶O(logN)1.3.3 线性阶O(n)1.3.4 线性对数阶O(nlogN)1.3.5 平方阶O(n)1.3.6 立方阶O(n)、K次方阶O(n^k) 二、空间复杂度2.1 O(1)2.2 O(n)2.3 O(n) 三、常用…

API管理平台:你用的到底是哪个?

Apifox是不开源的&#xff0c;在github的项目只是readme文件&#xff0c;私有化需要付费。当然saas版目前是免费使用的。 一、Swagger 为了让Swagger界面更加美观&#xff0c;有一些项目可以帮助你实现这一目标。以下是一些流行的项目&#xff0c;它们提供了增强的UI和额外的功…

Qt 容器类整理与使用

Qt提供了哪些容器类 Qt 提供了丰富的容器类&#xff0c;这些容器类主要用于存储和管理数据&#xff0c;按照其内部组织结构和功能特性&#xff0c;大致可分为顺序容器和关联容器两大类&#xff1a;顺序容器&#xff1a; QList - 动态数组&#xff0c;支持快速的头部和尾部插入…

OSCP靶场-- Sybaris

OSCP靶场–Sybaris 考点(redis MODULE LOAD命令执行) 1.nmap扫描 ## ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.158.93 -sV -sC -Pn --min-rate 2500 -p- Starting Nmap 7.92 ( https://nmap.org ) at 2024-04-11 04:24 EDT Nmap scan report for 192.168.158.93…

照片转漫画的软件有吗?分享4款热门的软件!

在数字化时代&#xff0c;我们总是追求新鲜、有趣、创意十足的方式来展现自我。其中&#xff0c;将普通照片转化为漫画风格的图像已成为许多年轻人的新宠。这种既能保留原照片中的人物特征&#xff0c;又能赋予其独特艺术气息的方式&#xff0c;让许多人趋之若鹜。那么&#xf…

PHP7垃圾回收算法

前提 本文为了梳理PHP GC工作流程&#xff0c;所以从引用计数、部分标记清除算法做引子&#xff0c;然后介绍PHP GC工作流程,最后介绍性能更高的GC算法 引用计数 概述 引用计数算法中引入了一个概念计数器。计数器代表对象被引用的次数 基本原理 为了记录一个对象有没有被…

APB协议中的PSEL、PSTROB、PENABLE、PREADY这4个信号的作用与用法

在详细探讨APB&#xff08;Advanced Peripheral Bus&#xff09;协议中的这四个信号之前&#xff0c;让我们先简单了解一下APB协议。APB是ARM公司的一种简单但高效的总线协议&#xff0c;主要用于低带宽和低性能需求的外围设备连接&#xff0c;如定时器、接口控制、UART等。它是…

微信公众号第三方平台-公众号扫码授权接入代运营

文章目录 接入目的效果展示技术积累如何成为服务商如何搭建第三方后端服务传统模式V云服务模式如何完成商家授权授权逻辑介绍 环境准备注册开发者平台-个人类型 传统模式后端代码接收公众号个人三方平台的票据根据票据获取三方平台访问令牌根据访问令牌获取预授权码通过预授权码…

OJ 【难度1】【Python】完美字符串 扫雷 A-B数对 赛前准备 【C】精密计时

完美字符串 题目描述 你可能见过下面这一句英文&#xff1a; "The quick brown fox jumps over the lazy dog." 短短的一句话就包含了所有 2626 个英文字母&#xff01;因此这句话广泛地用于字体效果的展示。更短的还有&#xff1a; "The five boxing wizards…

[Linux] 权限控制命令 chmod、chown和chgrp

文章目录 chmodchownchgrp chmod 在Linux系统中&#xff0c;root用户可以使用chmod命令来修改文件的权限&#xff0c;并且root用户也可以授权普通用户来执行chmod命令。要将权限授予普通用户修改一个文件的权限&#xff0c;可以使用以下步骤&#xff1a; 使用root用户登录到L…

网络——初识网络

在现如今&#xff0c;网络已经成了一种基础设施&#xff0c;大到国家&#xff0c;小到个人&#xff0c;网络已经充斥在我们每个人的身 边&#xff0c;如果一个人突然失去了网络&#xff0c;那么它的生活或多或少会出现一些不方便的地方&#xff0c;网络现在已 经伴随着我们的吃…

axios-mock-adapter使用

文章目录 1. 安装 axios-mock-adapter2. 引入所需的库3. 创建一个模拟适配器实例4. 定义模拟响应5. 在你的代码中使用 axios6. 在测试或开发完成后清理模拟 axios-mock-adapter 是一个用于模拟 axios HTTP 请求的库。它允许你在测试或开发过程中&#xff0c;为 axios 实例提供…

Solana主网使用自定义的RPC进行转账

1、引言 如果用 browser 连接主网的 RPC server 会收到 error code 403 message 為 Access forbidden, contact your app developer or supportrpcpool.com. 错误&#xff0c;因为主网的 RPC server 会检查 HTTP Header 如果判断出來是 browser 就会报告 403 錯誤。 要解決这…

【LeetCode热题100】53. 最大子数组和(数组)

一.题目要求 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 二.题目难度 中等 三.输入样例 示例 1&#xff1a; 输入&#xff1a;nu…

N 皇后 - 蓝桥杯?-Lua 中文代码解题第6题

n 皇后问题 研究的是如何将 n 个皇后放置在 n n 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回 n 皇后问题 不同的解决方案的数量。 示例 1&#xff1a; 输入&#xff1a;n 4 输出&#xff1a;2 解释&#xff1a;如上图所示&…

吴恩达2022机器学习专项课程(一) 5.2 向量化(1) 5.3 向量化(2)

问题预览/关键词 什么是向量化&#xff1f;向量化的好处是&#xff1f;如何向量化多元线性回归函数的参数&#xff1f;如何在Python中向量化参数&#xff1f;计算机底层是如何计算向量化的&#xff1f;向量化示例 笔记 1.向量化 一种在数学和计算中广泛使用的概念&#xff…

[Mac]安装App后“XX已损坏,无法打开“

问题&#xff1a; “xx.app”已损坏&#xff0c;无法打开。你应该将它移到废纸篓。 解决&#xff1a; 终端输入sudo xattr -r -d com.apple.quarantine 后将Applications中对应的问题app拖入生成路径&#xff0c;然后执行。 $ sudo xattr -r -d com.apple.quarantine /Appli…