101. 对称二叉树
一、算法逻辑(逐步通顺讲解每一步思路)
该算法的目标是判断一棵二叉树是否关于中心对称。即:左子树是右子树的镜像结构。
该实现采用 递归 + 双指针对比 的策略:
1️⃣ 特判空树
若整棵树为 (这里删去,下面已经做过判断)None,说明它是空树。空树天然对称,直接返回 True。
if not (p or q): # 都是空节点
return True
2️⃣ 定义辅助函数 dfs(p, q)
该函数的作用是:比较两个节点 p 和 q 代表的子树是否对称。它遵循如下逻辑:
✅ 基本情况(递归边界)
-
如果
p和q都是空的 → 表示对称,返回True; -
如果仅有一个为空 → 不对称,返回
False; -
如果两者值不同 → 不对称,返回
False;
✅ 递归处理子树
在当前节点值相等的前提下:
-
递归判断
p.leftvsq.right; -
同时递归判断
p.rightvsq.left;
只有这两组子树都对称,当前结构才对称。
3️⃣ 从根节点的左右子树开始比较
调用 dfs(root.left, root.right) 开始整棵树的对称性判断。
二、核心点总结
这段代码的核心思想是:
将树的“对称性”问题转化为“两个子树是否镜像”的判断,并使用递归双指针同步对比两棵子树的结构与值。
-
✅ 双指针
p、q分别走向左、右子树的“对称位置”; -
✅ 比较顺序是 “左对右,右对左”,从而形成“镜像”判定;
-
✅ 本质是结构和数值都一致的镜像匹配问题。
class Solution:
def isSymmetric(self, root: Optional[TreeNode]) -> bool:
def dfs(p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:
if not (p or q): # 都是空节点
return True
if not (p and q): # 只有一个为空,不对称
return False
if p.val != q.val: # 值不等,不对称
return False
# 递归判断:左对右,右对左
return dfs(p.left, q.right) and dfs(p.right, q.left)
return dfs(root.left, root.right)
三、时间复杂度分析
每个节点:
-
被访问一次;
-
比较一次值和两个递归;
所以:
时间复杂度:O(n),其中
n是树的节点数。
四、空间复杂度分析
来自递归调用栈:
-
最坏情况:树退化成链,递归深度为 O(n);
-
平均情况(平衡树):递归深度为 O(log n);
空间复杂度:O(h),其中
h是树的高度。
✅ 总结一句话
这段递归算法通过“双指针同步走位 + 镜像递归判断”的方式,判断二叉树是否左右对称,在 O(n) 时间与 O(h) 空间内完成对称性检测,是树形结构中对称性检查问题的标准解法之一。
1227

被折叠的 条评论
为什么被折叠?



