题目
题目描述
给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
示例 1:
输入:p = [1,2,3], q = [1,2,3]
输出:true
示例 2:
输入:p = [1,2], q = [1,null,2]
输出:false
示例 3:
输入:p = [1,2,1], q = [1,1,2]
输出:false
提示:
两棵树上的节点数目都在范围 [0, 100] 内
-
1
0
4
10^4
104 <= Node.val <=
1
0
4
10^4
104
题解
要判断两棵二叉树是否相同,可以通过递归的方法来实现。具体来说,我们可以通过比较两棵树的根节点值以及它们各自的左子树和右子树来确定这两棵树是否相同。如果在任意一步中发现两者不匹配(包括一个为空而另一个非空,或者节点值不同),则可以立即返回 false
;否则,当两棵树都遍历完毕且每一步都匹配时,返回 true
。
解决方案
-
基本情况:
- 如果两个节点都是
null
,那么它们是相同的。 - 如果其中一个节点是
null
而另一个不是,则它们不相同。 - 如果两个节点的值不同,则它们不相同。
- 如果两个节点都是
-
递归检查:
- 递归地检查两个节点的左子树是否相同。
- 递归地检查两个节点的右子树是否相同。
-
合并结果:
- 只有两个节点的值相同,并且它们的左子树和右子树也都相同时,这两个节点才是相同的。
python实现
下面是一个基于上述逻辑的Python实现:
def isSameTree(p: TreeNode, q: TreeNode) -> bool:
# 如果两个节点都为空,则它们是相同的
if not p and not q:
return True
# 如果其中一个为空而另一个不为空,则它们不相同
if not p or not q:
return False
# 如果两个节点的值不同,则它们不相同
if p.val != q.val:
return False
# 递归检查左子树和右子树
return isSameTree(p.left, q.left) and isSameTree(p.right, q.right)
这段代码首先定义了一个二叉树节点类 TreeNode
,然后实现了 isSameTree
函数来判断给定的两棵二叉树是否相同。通过递归地比较每个节点及其左右子树,我们可以有效地判断两棵树是否在结构和节点值上完全一致。这种方法的时间复杂度为 O(n),其中 n 是树中节点的数量,因为每个节点都被访问一次。