【LeetCode226】翻转二叉树

server/2025/3/6 6:02:51/

题目描述

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

思路与算法

这个问题自然是递归的,因为反转一棵树涉及到反转它的子树。
让 f(node) 是一个函数,用于反转以 node 为根的二叉树。如果 node 有左子树 L 和右子树 R,那么根据定义,反转以 node 为根的树是通过首先反转右子树 R 得到 f®,反转左子树 L 得到 f(L),然后交换这两个反转后的子树。用公式表示,我们可以写为:
f(node)=Node(node.val,left=f(node.right),right=f(node.left))

  • Base Case: 如果当前节点是 None ,那么没有什么可以反转的,因此我们返回 None
  • 递归步骤:对于每个节点
    • 递归地反转它的左子树
    • 递归地反转它的右子树
    • 交换这两个反转的子树

代码

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:if not root:return Noneinverted_left = self.invertTree(root.right)inverted_right = self.invertTree(root.left)root.left = inverted_leftroot.right = inverted_rightreturn root

总结

假设你有一个大盒子,里面装着一个小盒子,小盒子里又装着更小的盒子……一直到最小的盒子里什么都没有。每个盒子的结构都和大盒子一样,只不过尺寸变小了。解决问题的时候,你可以先解决最小盒子的问题,再一层一层往外解决,这就是递归的做法。
递归就是类似这种“在里面还藏着同样的东西”的思想。(同样的东西,或许是同样的函数映射)
简单来说,递归思想就是把一个大问题拆成和原问题很像但更小的问题,一直拆到最简单的时候再一步步合起来解决。这样的方法就叫做递归。

形成递归解决方案/形成递归结构的通用模式

  1. 确定base case(s):
    • 确定可以直接解决的最简单问题实例。
    • base case停止递归,防止无限循环
    • 在树问题中,base case通常是当前节点为 null(或当你到达叶子节点时)
  2. 拆解问题
    • 确保子问题在性质上与原始问题相似。
    • 在二叉树的翻转中,翻转整个树的问题简化为翻转左子树和右子树。
  3. 定义递归步骤
    • 清楚地表达问题的解决方案如何依赖于其子问题的解决方案
    • 形式举例:f(node)=Node(node.val,left=f(node.right),right=f(node.left)),这个方程清楚地表达了整个树的解(即 f(node))是如何依赖于其子问题的解(即 f(node.left) 和 f(node.right))。
  4. 组合子问题的解决方案
    • 例如:在反转子树后,交换它们以形成反转树。
  5. 注意
    • 不正确或缺失的基例可能导致无限递归或错误的结果
    • 确保每个递归调用都是在一个严格更小或更简单的问题实例上

http://www.ppmy.cn/server/172804.html

相关文章

【Spring AOP】_切点类的切点表达式

目录 1. 根据方法签名匹配编写切点表达式 1.1 具体语法 1.2 通配符表达规范 2. 根据注解匹配编写切点表达式 2.1 实现步骤 2.2 元注解及其常用取值含义 2.3 使用自定义注解 2.3.1 编写自定义注解MyAspect 2.3.2 编写切面类MyAspectDemo 2.3.3 编写测试类及测试方法 在…

Python的枚举enumerate学习

这个enumerate可以说是非常常用和强大的一个东西,值得单独盘点学习复习一下。 关键语法拆解 for i, (doc, meta, doc_id) in enumerate(zip(docs, metas, ids)):# 处理每个元素的代码1️⃣ zip(docs, metas, ids) 功能:将3个列表逐元素打包成元组示例…

LC串联带初始值的时域表达式

LC串联,在t0时刻接入直流电压 U i n U_{in} Uin​。 电感电流 i ( t ) i(t) i(t)和电容电压 u c ( t ) u_c(t) uc​(t)的时域表达式可通过二阶微分方程求解。以下是推导过程与结果: 1. 微分方程建立 电感 L L L与电容 C C C串联,接入直流…

如何为 Power Automate 配置 Azure Key Vault 权限

前言 最近,在Power Automate中使用Azure Key Vault,然后,就需要配置一下AKV的权限。 正文 1.我们在Azure Portal里新建一个Key vault,如下图: 2.进入Access policies,点击Create,如下图&#xf…

网上花店微信小程序+论文源码调试讲解

第四章 系统设计 4.1 总体功能 网上花店微信小程序是根据需求定制开发,开发软件选用IDEA平台配合MySQL数据库进行开发环境的搭建操作,网站采用WEB应用程序中最流行的小程序结构进行开发,用户访问系统数据仅仅需要在客户端安装谷歌浏览器或者…

Hi3516CV610电瓶车检测 电动自行车检测 人脸检测 人形检测 车辆检测 宠物检测 包裹检测 源码

海思全线一代AI摄像机SoC,在板端实现实时AI检测,视频传输、视频录像、报警等功能 Hi3516CV610开发板实时AI检测效果演示,实时在板端完成 视频采集—AI检测—视频编码—网络传输,AI检测算法无需license无需授权,终身免…

SQL经典常用查询语句

1. 基础查询语句 1.1 查询表中所有数据 在SQL中,查询表中所有数据是最基本的操作之一。通过使用SELECT * FROM table_name;语句,可以获取指定表中的所有记录和列。例如,假设有一个名为employees的表,包含员工的基本信息&#xf…

任务9:交换机基础及配置

CSDN 原创主页:不羁https://blog.csdn.net/2303_76492156?typeblog 一、交换机基础 交换机的概念:交换机是一种网络设备,用于连接多台计算机或网络设备,实现数据包在局域网内的快速交换。交换机基于MAC地址来转发数据包&#x…