题目描述
判断二叉树是否轴对称(沿根的竖线翻折后左右重合)。
树 = 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(镜像是外侧配外侧)
以上文字与上方动画完全同一思路:先看动画建立直觉 → 读文字巩固 → 关掉页面自己默写一遍代码,能写出来才算真的掌握。