题目描述
思路解析动画文字版
只看值是否出现会误判,必须比较整棵结构。
在 root 每个节点处尝试 sameTree:值相同、左右子树也相同才算命中。
1. 逐个节点当候选根:在 root 里找一棵和 subRoot 完全相同的子树。逐个节点当候选根。先以 3 试:3 ≠ subRoot 的根 4 → 不匹配,继续递归。
2. 递归到 4 · 根值相等 → 候选:递归到节点 4:它的值和 subRoot 的根 4 相等 → 值得把整棵子树比一比。
3. 关键帧 · 整棵子树逐点比对:关键帧:把以 4 为根的子树 [4,1,2] 和 subRoot [4,1,2] 逐节点比:根、左、右全相等 → 子树命中!
4. 命中 → 返回 true:找到一棵和 subRoot 完全相同的子树 → 返回 true。
5. 要点 · 必须整棵完全相同:关键:必须整棵子树完全相同(每个节点值 + 结构都一致)。若 subRoot 少了那个 2,就不算 4 的子树 —— 子树是「连根带所有后代」,不能多也不能少。
一句话记住:在 root 每个节点处尝试 sameTree:值相同、左右子树也相同才算命中。
边界三连:三种边界先想清楚。
面试追问 1:核心思路。
面试追问 2:复杂度分析。
面试追问 3:KMP 优化。
这题学完不要乱跳,下一步去对应专题 /leetcode-animation/ds?k=tree 连刷同类题;卡住时用 AI 答疑问“我的状态定义哪里不稳”。
参考代码
class Solution: def isSubtree(self, root, subRoot): def same(a, b): if not a and not b: return True if not a or not b or a.val != b.val: return False return same(a.left, b.left) and same(a.right, b.right) if not subRoot: return True if not root: return False return same(root, subRoot) or self.isSubtree(root.left, subRoot) or self.isSubtree(root.right, subRoot)复杂度
- 时间复杂度:O(m·n),m 个 root 节点,每个最坏触发一次 O(n) 的同构比较
- 空间复杂度:O(h),递归栈深度 = 树高
可套用的代码模板
骨架:遍历 root 每个节点,用 same() 判「以它为根是否和 subRoot 完全相同」。
Python
# 子树判断骨架def isSubtree(root, subRoot): if not subRoot: return True if not root: return False if same(root, subRoot): return True # 当前节点为根试一试 return isSubtree(root.left, subRoot) or isSubtree(root.right, subRoot)# same(a,b): 判两棵树是否逐节点完全相同(同 LC100)易错点
面试追问把动画讲成自己的话
追问核心思路是什么?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
二叉搜索树的最近公共祖先
LeetCode 235 · 中等 · 沿着 树 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题