LeetCode 226. 翻转二叉树(Invert Binary Tree)

一、题目描述

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

所谓翻转二叉树,就是交换每个节点的左右子树。

示例:

输入:

复制代码
        4
      /   \
     2     7
    / \   / \
   1   3 6   9

输出:

复制代码
        4
      /   \
     7     2
    / \   / \
   9   6 3   1

二、为什么这题值得学习

LeetCode 226 是二叉树最经典的入门题之一,也是很多公司喜欢考察的 DFS 基础题。

虽然代码只有几行,但它能够帮助我们理解:

  • 二叉树递归思想
  • DFS(深度优先搜索)
  • 前序、后序遍历的应用
  • BFS(层序遍历)

这道题最大的价值不是交换左右节点,而是理解递归到底是在做什么。


三、核心思想

翻转二叉树其实就是:

遍历整棵树,把每一个节点的左右孩子交换即可。

例如:

原树:

复制代码
      A
     / \
    B   C

交换后:

复制代码
      A
     / \
    C   B

对于每一个节点都执行同样的操作,因此天然适合递归。


四、解法一:递归(推荐)

思路

对于当前节点:

  1. 交换左右孩子;
  2. 翻转左子树;
  3. 翻转右子树。

递归结束条件:

复制代码
root == null

直接返回。


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

执行过程

例如:

复制代码
      4
     / \
    2   7

第一步:

交换:

复制代码
      4
     / \
    7   2

继续递归:

复制代码
翻转7

↓

翻转2

直到所有节点完成交换。


复杂度分析

指标 数值
时间复杂度 O(n)
空间复杂度 O(h)(递归栈)

其中:

  • n 为节点数量
  • h 为树高

五、解法二:DFS(显式栈)

递归其实就是系统帮我们维护了一个栈。

我们也可以自己维护一个栈。


思路

  1. 根节点入栈;
  2. 弹出节点;
  3. 交换左右孩子;
  4. 左右孩子继续入栈。

直到栈为空。


Java 实现

复制代码
class Solution {

    public TreeNode invertTree(TreeNode root) {

        if (root == null) {
            return null;
        }

        Deque<TreeNode> stack = new ArrayDeque<>();
        stack.push(root);

        while (!stack.isEmpty()) {

            TreeNode node = stack.pop();

            TreeNode temp = node.left;
            node.left = node.right;
            node.right = temp;

            if (node.left != null) {
                stack.push(node.left);
            }

            if (node.right != null) {
                stack.push(node.right);
            }
        }

        return root;
    }
}

复杂度分析

指标 数值
时间复杂度 O(n)
空间复杂度 O(h)

六、解法三:BFS(层序遍历)

除了 DFS,还可以按层遍历整棵树。

利用队列:

每访问一个节点:

直接交换左右孩子。


思路

复制代码
根节点入队

↓

弹出节点

↓

交换左右孩子

↓

左右孩子入队

↓

直到队列为空

Java 实现

复制代码
class Solution {

    public TreeNode invertTree(TreeNode root) {

        if (root == null) {
            return null;
        }

        Queue<TreeNode> queue = new ArrayDeque<>();
        queue.offer(root);

        while (!queue.isEmpty()) {

            TreeNode node = queue.poll();

            TreeNode temp = node.left;
            node.left = node.right;
            node.right = temp;

            if (node.left != null) {
                queue.offer(node.left);
            }

            if (node.right != null) {
                queue.offer(node.right);
            }
        }

        return root;
    }
}

复杂度分析

指标 数值
时间复杂度 O(n)
空间复杂度 O(n)

最坏情况下,队列可能保存整层节点。


七、三种解法对比

解法 推荐程度 时间复杂度 空间复杂度 面试评价
递归 ⭐⭐⭐⭐⭐ O(n) O(h) 最常用、代码最简洁
DFS(栈) ⭐⭐⭐⭐ O(n) O(h) 展示递归转迭代能力
BFS(队列) ⭐⭐⭐⭐ O(n) O(n) 展示层序遍历思想

八、面试高频追问

❓ 为什么递归能够解决?

因为每个节点执行的操作完全一致:

交换左右子树。

每棵子树又是一棵完整的二叉树,因此天然具有递归结构。


❓ 为什么可以前序也可以后序?

因为:

交换左右孩子不会影响最终结果。

所以:

复制代码
交换

↓

递归左右

或者:

复制代码
递归左右

↓

交换

最终得到的树完全一样。


❓ 时间复杂度是多少?

每个节点只访问一次。

所以:

复制代码
O(n)

❓ 空间复杂度是多少?

递归:

复制代码
O(h)

h 为树高。

如果:

树退化成链表。

最坏:

复制代码
O(n)

九、常见错误

1. 忘记交换

很多人写成:

复制代码
invertTree(root.left);
invertTree(root.right);

结果:

没有交换。

树不会发生变化。


2. 空指针

忘记:

复制代码
if(root==null)

会:

复制代码
root.left

空指针异常。


3. 交换顺序写错

正确:

复制代码
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;

不要直接:

复制代码
root.left = root.right;
root.right = root.left;

否则:

左右孩子都会变成同一个节点。


十、一句话总结

翻转二叉树的本质就是遍历整棵树,并交换每个节点的左右子树 。递归实现最简单,也是面试最推荐的写法;DFS 和 BFS 本质上都是对递归思想的迭代实现,三种方法时间复杂度均为 O(n)。

相关推荐
微尘hjx8 小时前
【ByteTrack 04】多轨迹算法ByteTrack改进点
算法·yolo·目标检测·目标跟踪·bytetrack·ultralytics·车跟踪
行走的陀螺仪11 小时前
【转型攻略】2026 年,后端 / 全栈工程师转 AI Agent 方向:能力地图、按周学习路线与面试要点
人工智能·面试·职场和发展
小蒋观天下12 小时前
雷击与浪涌防护:前端SPD选型、接地网误区,接地不当反而引入干扰
深度学习·算法·机器学习
WBluuue13 小时前
数据结构与算法:分块(一):块状数组、块状链表
数据结构·c++·算法·链表
圣保罗的大教堂13 小时前
leetcode 3619. 总价值可以被 K 整除的岛屿数目 中等
leetcode
澳鹏Appen15 小时前
澳鹏重磅发布ExamOCRBench:面向端到端试卷判分的多任务基准
算法·benchmark·基准评测
benjormin15 小时前
Java数据结构 二叉搜索树
数据结构·算法
人工智能培训15 小时前
知识图谱:结构化表达实体与关系的知识组织技术
大数据·人工智能·算法·重构·生活·知识图谱
地平线开发者15 小时前
QAT 实战:从 PyTorch 模型到 J6E 实板精度与延时验证
pytorch·算法·自动驾驶