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)

相关推荐
从零开始的代码生活_1 小时前
C++ stack、queue 与 priority_queue:容器适配器原理与实战
开发语言·c++·后端·学习·算法
2zcode1 小时前
项目文档:基于MATLAB低采样率ISAR成像的快速稀疏重建算法研究
开发语言·算法·matlab
哈里沃克2 小时前
编译与链接 - 02
算法
巴糖2 小时前
Embedding了解一些
算法
战族狼魂2 小时前
广东备案大模型超百款
人工智能·算法·大模型·大语言模型
千桐科技2 小时前
🚀 qModel 算法模型平台v1.2.0 开源版发布!Python 模型接入链路全面升级,告别“能跑但上不了线”的尴尬
后端·算法·llm
刘沅2 小时前
LeetCode 93.复原IP地址
算法·面试
阿里技术3 小时前
Agent 评测:方法论与体系设计
大数据·人工智能·算法
cxr8284 小时前
大语言模型上下文缓存命中率测试全场景清单
人工智能·python·算法·缓存·语言模型·自然语言处理·llm