【简单】力扣算法题解析LeetCode226:翻转二叉树

关注文末推广名片,即可免费获得本题测试源码

题目来源:LeetCode226:翻转二叉树

问题抽象:设计算法将二叉树原地翻转(镜像反转每个节点的左右子树),需满足以下核心需求:

  1. 翻转规则

    • 对每个非叶节点,交换其左右子树(递归至叶子节点终止);
    • 翻转后树的结构满足:原左子树变为右子树,原右子树变为左子树。
  2. 实现约束

    • 原地修改:直接修改节点指针指向,禁止创建新树;
    • 时间复杂度 O(n)(需访问所有节点,n 为节点数);
    • 空间复杂度 O(h)(递归栈深度,h 为树高,最坏 O(n))。
  3. 核心操作

    • 递归交换(DFS):
      • 递归翻转左子树 → 递归翻转右子树 → 交换当前节点的左右指针;
    • 迭代实现(BFS):
      • 层序遍历,每访问一个节点立即交换其左右子树。
  4. 边界处理

    • 空树直接返回 null
    • 单节点树无需操作(无子树可交换);
    • 叶子节点:递归终止(无子节点)。

输入:二叉树根节点 root(节点数 n ∈ [0,100]
输出:翻转后的二叉树根节点(同输入根节点)


解题思路

要翻转二叉树,本质是交换每个节点的左右子树。核心思路如下:

  1. 递归法

    • 从根节点开始,递归地交换每个节点的左右子树。
    • 先交换当前节点的左右子树,再递归处理左子树和右子树(此时左右子树已交换)。
    • 时间复杂度:O(n),每个节点访问一次。
    • 空间复杂度:O(h),其中 h 为树的高度,递归栈深度。
  2. 迭代法(广度优先)

    • 使用队列辅助层序遍历。
    • 每次从队列取出节点,交换其左右子树,再将非空的子节点入队。
    • 时间复杂度:O(n),每个节点访问一次。
    • 空间复杂度:O(w),其中 w 为树的最大宽度(队列存储)。

亮点

  • 递归法代码简洁,在树较平衡时空间更优(O(log n))。
  • 迭代法避免递归开销,但队列空间可能较大(最坏 O(n))。
  • 由于树节点数 ≤100,递归法更简洁高效,选用递归法

代码实现(Java版)🔥点击下载源码

class Solution {
    public TreeNode invertTree(TreeNode root) {
        // 递归终止条件:当前节点为空时直接返回
        if (root == null) {
            return null;
        }
        // 交换当前节点的左右子树
        TreeNode temp = root.left;
        root.left = root.right;
        root.right = temp;
        // 递归翻转左右子树
        invertTree(root.left);
        invertTree(root.right);
        return root;
    }
}

代码说明

  1. 递归终止条件:若当前节点为 null,直接返回(处理空树或叶子节点)。
  2. 交换子树:使用临时变量 temp 交换当前节点的左右子树。
  3. 递归调用:对交换后的左右子树递归执行翻转操作。
  4. 返回根节点:最终返回翻转后的根节点。

提交详情(执行用时、内存消耗)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

达文汐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值