图解题库 / 二叉树 · 递归

226. 翻转二叉树

简单 含交互动画

学完这道你应该能: 说清它为什么用「递归」,而不是死记步骤; 合上页面,自己默写出核心代码; 用 30 秒把思路讲清楚。

题目描述

翻转二叉树(镜像):每个节点的左右孩子互换

原树 = 4 →(2,7), 2→(1,3), 7→(6,9)
翻转后 = 4 →(7,2), 7→(9,6), 2→(3,1)

思路解析

到任意节点,先把它的左、右两个孩子指针互换,再分别递归翻转左右子树。前序后序都行——只要每个节点都被交换一次。

原树:原树。从根 4 开始,先交换它的左孩子(2)和右孩子(7)。

根 4 · 交换 2 ↔ 7:根的两棵子树整体对调:原来的右子树(7,6,9)挪到左边、左子树(2,1,3)挪到右边。注意子树是整块搬动的。

递归左边(原 7) · 交换 6 ↔ 9:进入现在的左孩子 7,交换它的两个孩子 6 和 9 → 变成 (9, 6)。

递归右边(原 2) · 交换 1 ↔ 3:再进入右孩子 2,交换它的孩子 1 和 3 → 变成 (3, 1)。

完成 · 整棵镜像:每个节点都交换过一次,整棵树成了原树的镜像:4 →(7,2),7→(9,6),2→(3,1)。

很多树题的本质是「对每个节点都做某个简单操作」,用递归自动覆盖全树。翻转、给每个节点加值、收集每个节点都是这个套路。

参考代码(Python)

Python
1def invertTree(self, root):
2    if not root: return None
3    root.left, root.right = root.right, root.left   # 交换
4    self.invertTree(root.left)    # 递归翻左
5    self.invertTree(root.right)   # 递归翻右
6    return root

复杂度分析

  • 时间复杂度:O(n) —— 每个节点交换一次
  • 空间复杂度:O(h) —— 递归栈 = 树高

套路模板

记住骨架:空则返回、对当前节点做操作、递归左右。换"操作"就能做翻转、加权、剪枝等一大类「对全树统一处理」的题。

Python
1def dfs(node):
2    if not node: return
3    操作(node)              # 对当前节点做事(如交换孩子)
4    dfs(node.left)
5    dfs(node.right)

易错点

  • 先递归再交换(用了已变的指针) → ✅ 交换可放前序或后序,但别交叉(若先把 left 递归改了再交换会乱套)
  • 只换值不换子树 → ✅ 交换的是左右孩子指针(要把整棵子树搬过去,不是只换根的值)

以上文字与上方动画完全同一思路:先看动画建立直觉 → 读文字巩固 → 关掉页面自己默写一遍代码,能写出来才算真的掌握

下一题 →102. 二叉树的层序遍历 ← 返回题库