【LeetCode226】翻转二叉树

题目描述

给你一棵二叉树的根节点 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
  • 递归步骤:对于每个节点
    • 递归地反转它的左子树
    • 递归地反转它的右子树
    • 交换这两个反转的子树

代码

python 复制代码
# 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 None
        inverted_left = self.invertTree(root.right)
        inverted_right = self.invertTree(root.left)

        root.left = inverted_left
        root.right = inverted_right
        return 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. 注意
    • 不正确或缺失的基例可能导致无限递归或错误的结果
    • 确保每个递归调用都是在一个严格更小或更简单的问题实例上
相关推荐
深邃-1 小时前
【数据结构与算法】-二叉树(2):实现顺序结构二叉树(堆的实现),向上调整算法,向下调整算法,堆排序,TOP-K问题
数据结构·算法·二叉树·排序算法·堆排序··top-k
We་ct4 小时前
LeetCode 5. 最长回文子串:DP + 中心扩展
前端·javascript·算法·leetcode·typescript
王老师青少年编程8 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【哈夫曼贪心】:合并果子
c++·算法·贪心·csp·信奥赛·哈夫曼贪心·合并果子
叼烟扛炮8 小时前
C++第二讲:类和对象(上)
数据结构·c++·算法·类和对象·struct·实例化
天疆说8 小时前
【哈密顿力学】深入解读航天器交会最优控制中的Hamilton函数
人工智能·算法·机器学习
wuweijianlove9 小时前
关于算法设计中的代价函数优化与约束求解的技术7
算法
小程故事多_809 小时前
[大模型面试系列] 多轮对话 Agent 设计实战(含窗口优化 + 工具调用精髓)
人工智能·面试·职场和发展
leoufung10 小时前
LeetCode 149: Max Points on a Line - 解题思路详解
算法·leetcode·职场和发展
样例过了就是过了10 小时前
LeetCode热题100 最长公共子序列
c++·算法·leetcode·动态规划
HXDGCL10 小时前
矩形环形导轨:自动化循环线的核心运动单元解析
运维·算法·自动化