第5章|二叉树与递归
Unit 04 · LeetCode #100 相同的树
相同不是“遍历值一样”,
而是每个对应位置同时相同。
两棵树必须同步推进:对应位置同时为空,或同时存在且节点值相等;随后继续比较左对左、右对右。任何一个位置失败,整棵树立即失败。
left.left ↔ right.right,方向会在中心轴两侧反转。
p.left ↔ q.left,两个位置沿完全相同的左右路径同步推进。
题目要求
给定两棵二叉树的根节点 p 和 q,判断它们是否相同。两棵树相同,当且仅当结构完全一致,并且对应节点具有相同的值。
- 两棵树节点数量均在
[0,100]范围内; -10⁴ ≤ Node.val ≤ 10⁴。
示例
输出:true
输出:false
输出:false
双节点递归 DFS:每个对应位置最多检查一次,时间复杂度 O(n),递归栈空间 O(h)。
从两棵树根节点出发,沿相同的左右路径到达的位置。
两个对应位置都为 None,说明该分支结构同步结束。
只有一个位置为空,结构立即不一致,不能访问 val。
左子树已经不同后,不再执行右子树比较。
当前两棵树的非空先序值都为 [1,2],但节点 2 位于不同方向。
当前与后续节点对
调用栈(顶部为当前比较)
观察当前动画状态后回答
提交前审查清单
① 先判断双空;② 再判断单空;③ 两侧非空后才能访问 val;④ 左对左、右对右;⑤ 两个递归结果用 and 组合。
迁移目标:LeetCode #572 另一棵树的子树
把 #100 的 same_tree 当作局部验证器;外层递归只负责依次尝试当前节点、左子树和右子树。迁移增量是“搜索候选起点”,不是重新学习树相等。
LeetCode #572|另一棵树的子树
迁移原题
给定两棵二叉树 root 和 subRoot,检验 root 中是否存在一个节点,使得以该节点为根的子树与 subRoot 具有相同结构和节点值。
示例
输出:true
输出:false
核心结构:当前候选相同 OR 左侧找到 OR 右侧找到。
复用完整相等判断,只新增候选根搜索
same_tree(p,q) 可以准确验证两个给定根开始的完整子树是否相同。
嵌入搜索
若当前 root 不是候选答案,不能直接 False;还要在 root.left 与 root.right 继续寻找。
当前候选 root=3、subRoot=4,same_tree 返回 False。外层函数下一步应该做什么?
两个递归层次必须保持职责分离
| 层次 | 输入 | 返回含义 | 失败后动作 |
|---|---|---|---|
| 局部验证器 | p, q | 这两个根开始的树是否完全相同 | 返回 False |
| 候选搜索器 | root, subRoot | root 范围内是否存在匹配子树 | 继续搜索左右子树 |
当前候选 root=4 与 subRoot=4 已由 same_tree 验证为 True,应返回什么?
只拼接“外层搜索器”,same_tree 已作为可靠脚手架提供
片段库
isSubtree 外层骨架
观察“当前候选失败后继续搜索”的不可替代状态
Unit 04 Skill 卡
相同树把两棵树转写为同步的“对应位置节点对”。迁移到子树搜索时,#100 成为局部验证器,新增的外层递归只负责枚举候选根。两个递归层次必须各自保持单一职责。
请先停留观察高亮节点与返回值,确认你能解释为什么当前判断成立或失败。