题目描述
翻转二叉树(镜像):每个节点的左右孩子互换。
原树 = 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 递归改了再交换会乱套)
- ❌ 只换值不换子树 → ✅ 交换的是左右孩子指针(要把整棵子树搬过去,不是只换根的值)
以上文字与上方动画完全同一思路:先看动画建立直觉 → 读文字巩固 → 关掉页面自己默写一遍代码,能写出来才算真的掌握。