题目描述
思路解析动画文字版
关键不是背模板,而是看懂为什么这题适合二叉树 · 递归。
1. 同时比 p、q 的根:约定:下面这棵树画的是 p,queue 同步报出 q 在对应位置的值,逐点对比。isSameTree 三道关卡:①都空→相同 ②一空一非→不同 ③值不等→不同 ④值相等→递归左右。根:p=1、q=1,相等。
2. 值相等 · 递归左孩子:根相等,递归比较左孩子:p.left=2、q.left=2,相等。
3. 走到 2 的孩子 · 都空:继续深入节点 2 的孩子:p、q 都是空 → 命中“都空 → 相同”,这一支返回 true。
4. 递归右孩子:回到根,递归比较右孩子:p.right=3、q.right=3,相等。
5. 处处相等 · 返回 true:所有对应节点都相等、结构一致 → isSameTree 返回 true。
6. 关键帧 · 反例(值不同):反例:queue 报出 q 这个位置是 4,而 p 是 3 → 3 ≠ 4,立刻 return false,不必再比其它。(红节点 = p、q 在此处值不一致)
7. 另一种反例 · 结构不同:另一种 false:p 这里有节点 2、q 对应位置是空 → 一空一非空 → false。(这里红节点 = p、q 在此处结构不一致:一边有、一边空)
把这句话记住,下次遇到同类题,就能更快选出方向。
边界三连:边界三连:极端输入先过一遍。
几个高频追问,记住答法。
参考代码
class Solution: def isSameTree(self, p, q): if not p and not q: return True if not p or not q: return False if p.val != q.val: return False return self.isSameTree(p.left, q.left) and self.isSameTree(p.right, q.right)复杂度
- 时间复杂度:O(min(m, n)),每对对应节点最多比一次,O(min(m, n))
- 空间复杂度:O(h),递归栈深度 = 树高 h
可套用的代码模板
模板不是死背,而是提醒你写代码前先把状态、转移和边界排好。
Python
# 双树同步递归骨架(相同/对称/子树通用)def f(a, b): if not a and not b: return True # 两边都空 if not a or not b: return False # 一边空 → 不匹配 if a.val != b.val: return False # 值不符 # 按题意配对递归:相同→左对左/右对右;对称→左对右/右对左 return f(a.left, b.left) and f(a.right, b.right)易错点
面试追问把动画讲成自己的话
追问和「对称二叉树 LC101」差在哪?
追问为什么先判空再比值?
追问复杂度?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
另一棵树的子树
LeetCode 572 · 简单 · 沿着 树 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题