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)

相关推荐
shirsl2 小时前
算法 Day 5 树 / 二叉树 + DFS
数据结构·python·算法
木子算法2 小时前
非凸、离散、还耦合:论文里的求解方法是一条四步流水线
人工智能·算法·目标跟踪
虚无的纽扣2 小时前
【力扣刷题】第二天:无重复字符的最长字串、移动零问题
算法·leetcode·排序算法
张祥6422889043 小时前
牛顿迭代法求解开普勒方程:从RTKLIB源码到数值分析
人工智能·算法·机器学习
Niuguangshuo3 小时前
论文解读:Deep Speech 2,工业级英中端到端 ASR 系统报告
算法·音视频·语音识别
钓鱼的肝3 小时前
csp-j-s总结(2)
c++·经验分享·笔记·算法·青少年编程
奇妙之二进制3 小时前
机器人导航路径规划算法入门(6)Dijkstra(迪杰斯特拉)算法深入解析
算法·导航
Niuguangshuo3 小时前
论文解读:Qwen2-Audio,阿里的通用音频语言模型
算法·音视频·语音识别
WiChP5 小时前
【V0.1B16】从零开始的2D游戏引擎开发之路
开发语言·算法·游戏引擎
番茄巴士5 小时前
手写一个 mini HashMap,彻底搞懂哈希表原理
算法