返回

LeetCode二叉树专题:相同树的辨别

Android

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二叉树专题中检验两棵二叉树是否相同的题目的剖析,我们掌握了分治与比较的解题思路,并使用递归和迭代两种方法实现了该算法。通过不断练习和挑战,我们可以提高算法设计和实现的能力,为日后的算法学习和应用打下坚实的基础。