相同的树-LeetCode
100. 相同的树 - Same Tree
🎯 问题描述(来源于LeetCode)
描述:
给定两个二叉树的根节点 p 和 q,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
说明:
- 两棵树均由
TreeNode节点组成,每个节点包含整数值val以及指向左子节点left和右子节点right的指针。 - 空树用
None表示。
示例:
- 示例 1:
1 | 输入: p = [1,2,3], q = [1,2,3] |
- 示例 2:
1 | 输入: p = [1,2], q = [1,null,2] |
💻 解题思路
思路1:递归深度优先比较(DFS)
算法步骤
-
处理空节点情况:
- 如果
p或q有一个是None(空节点),则只有当两者同时为None时才算相同,否则不同。 - 等价于:若其中一个为
None,则返回p == q(即p is None and q is None)。
- 如果
-
比较当前节点值:
- 如果当前两个节点都不为空,则先比较它们的
val是否相等。
- 如果当前两个节点都不为空,则先比较它们的
-
递归比较子树:
- 当节点值相等时,继续递归比较左子树(
p.left, q.left)和右子树(p.right, q.right)。 - 只有左右子树都相同,整棵树才相同。
- 当节点值相等时,继续递归比较左子树(
-
返回结果:
- 最终返回
(val 相等) && 左子树相同 && 右子树相同。
- 最终返回
思路1:代码实现
1 | # Definition for a binary tree node. |
思路1:📊 性能分析
复杂度验证
- 时间复杂度:,其中 、 分别是两棵树的节点数。最坏情况下需要遍历所有节点(当两棵树相同时)。
- 空间复杂度:,其中 、 是树的高度。递归调用栈的深度取决于较矮树的高度,最坏情况(链状树)为 。
思考
- 本题也可以用**广度优先搜索(BFS,队列)**实现,逐层比较节点值和结构,但递归写法最简洁直观。
- 注意
p is None or q is None的条件同时覆盖了“一个为空另一个非空”和“两个都为空”的情况,配合return q == p能正确处理两种情形,是简洁且高效的写法。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 笺札!






