图解题库 / 二叉树 · 递归

101. 对称二叉树

简单 含交互动画

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

题目描述

判断二叉树是否轴对称(沿根的竖线翻折后左右重合)。

= 1 →(2,2), 左2→(3,4), 右2→(4,3)
输出 = true

思路解析

写一个 isMirror(L, R):两个都空→对称;一个空一个非→不对称;否则要求 L.val==R.val,并且 L 的左 配 R 的右(外侧)、L 的右 配 R 的左(内侧),都成立才对称。

比根的两个孩子 · 2 = 2:从根的左孩子(2)和右孩子(2)比起:值相等 ✓。接着比它们的"外侧"和"内侧"。

外侧配外侧 · 3 = 3:左孩子的左(3)右孩子的右(3)——最外侧的一对,相等 ✓。

内侧配内侧 · 4 = 4:左孩子的右(4)右孩子的左(4)——里侧的一对,也相等 ✓。

处处相等 · 对称:每一对镜像位置都相等,整棵树对称,返回 true。只要有一对不等,立刻 false。

判断对称、相同、合并两棵树,都用「同时带着两个节点递归」的双指针式 DFS。对称就交叉(左配右),相同就平行(左配左)。

参考代码(Python)

Python
1def isMirror(L, R):
2    if not L and not R: return True       # 都空,对称
3    if not L or not R: return False       # 一空一非
4    return (L.val == R.val and
5            isMirror(L.left, R.right) and  # 外侧
6            isMirror(L.right, R.left))     # 内侧
7return isMirror(root.left, root.right) if root else True

复杂度分析

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

套路模板

记住骨架:两个都空→真、一空一非→假、值等且子树两两递归。「相同的树(100)」把交叉改成平行就行。

Python
1def dfs(a, b):
2    if not a and not b: return True
3    if not a or not b: return False     # 结构不一致
4    return a.val == b.val and \
5           dfs(a.?, b.?) and dfs(a.?, b.?)  # 对称交叉/相同平行

易错点

  • 只比较值,不管结构 → ✅ 先判空:一空一非要 False(结构不同(一边有一边没有)就不对称)
  • 递归写成平行 L.left,R.left → ✅ 对称要交叉 L.left,R.right(镜像是外侧配外侧)

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

下一题 →543. 二叉树的直径 ← 返回题库