LeetCode二叉树专题:相同树的辨别
2024-02-13 13:34:40
LeetCode二叉树专题:相同树的辨别
在算法领域,LeetCode是一个备受推崇的在线编程学习平台,汇聚了丰富的编程题目供用户练习和提升技能。二叉树专题则是LeetCode中广受关注的主题,它包含了一系列与二叉树相关的编程题目,旨在检验和提高算法爱好者的编程能力。其中,检验两棵二叉树是否相同的题目便是二叉树专题中的经典案例,它不仅考察了算法设计的基本功,更考验了灵活运用递归的思想。
解题思路:分治与比较
面对检验两棵二叉树是否相同的题目,我们可以先拆解问题,将其简化为若干个子问题,再逐个击破。其中,一个重要的解题思路就是分治与比较。我们将两棵二叉树的根结点进行比较,如果它们的值相等,则继续比较左右子树是否相等。如果根结点值不相等,则直接返回false,表明两棵树不同。
代码示例:递归实现
基于分治与比较的解题思路,我们可以使用递归算法来实现两棵二叉树的比较。以下代码展示了递归方法的实现:
def is_same_tree(p, q):
"""
检验两棵二叉树是否相同。
Args:
p: 第一棵二叉树的根结点。
q: 第二棵二叉树的根结点。
Returns:
True if two trees are the same, False otherwise.
"""
# 若两棵树均为空,则相同
if not p and not q:
return True
# 若两棵树中有一棵为空,则不同
if not p or not q:
return False
# 若两棵树的根结点值不相等,则不同
if p.val != q.val:
return False
# 比较左子树和右子树是否相同
return is_same_tree(p.left, q.left) and is_same_tree(p.right, q.right)
在代码中,我们首先检查两棵二叉树是否为空,若均为空则返回True,表示两棵树相同。若有一棵为空则返回False,表示两棵树不同。随后,我们比较两棵树根结点的值,若不相等则返回False,表示两棵树不同。最后,我们比较两棵树的左右子树是否相同,若都相同则返回True,否则返回False。
拓展思路:迭代实现
除了递归方法外,我们还可以使用迭代方法来实现两棵二叉树的比较。迭代方法通常使用栈或队列来存储需要比较的结点,然后逐一弹出结点进行比较。以下代码展示了迭代方法的实现:
def is_same_tree(p, q):
"""
检验两棵二叉树是否相同。
Args:
p: 第一棵二叉树的根结点。
q: 第二棵二叉树的根结点。
Returns:
True if two trees are the same, False otherwise.
"""
# 若两棵树均为空,则相同
if not p and not q:
return True
# 若两棵树中有一棵为空,则不同
if not p or not q:
return False
# 创建队列存储两棵树的结点
queue_p = [p]
queue_q = [q]
# 循环比较队列中的结点
while queue_p and queue_q:
# 取出两棵树的当前结点
p = queue_p.pop(0)
q = queue_q.pop(0)
# 若两棵树的当前结点值不相等,则不同
if p.val != q.val:
return False
# 将两棵树的左子树和右子树入队
if p.left and q.left:
queue_p.append(p.left)
queue_q.append(q.left)
elif p.left or q.left:
return False
if p.right and q.right:
queue_p.append(p.right)
queue_q.append(q.right)
elif p.right or q.right:
return False
# 若两棵树的结点都比较完了,则相同
return True
在代码中,我们首先检查两棵二叉树是否为空,若均为空则返回True,表示两棵树相同。若有一棵为空则返回False,表示两棵树不同。随后,我们创建两个队列存储两棵树的结点,并循环比较队列中的结点。若两棵树的当前结点值不相等,则返回False,表示两棵树不同。若相等,则将两棵树的左右子树入队,继续比较。当队列中的结点都比较完成后,若两棵树的结点都相同,则返回True,否则返回False。
总结
通过对LeetCode二叉树专题中检验两棵二叉树是否相同的题目的剖析,我们掌握了分治与比较的解题思路,并使用递归和迭代两种方法实现了该算法。通过不断练习和挑战,我们可以提高算法设计和实现的能力,为日后的算法学习和应用打下坚实的基础。