返回

透过剖析解题思路:二叉树对称性问题剖析

前端

二叉树是对称的,这意味着它的左右子树是镜像对称的。换句话说,如果我们把二叉树沿中轴线折叠,那么左右两侧的子树就会完全重合。

检查二叉树是否对称的一种简单方法是使用递归。我们可以从根节点开始,然后递归地检查它的左右子树。如果左右子树都是对称的,那么整个二叉树也是对称的。

def is_symmetric(root):
  """
  检查二叉树是否对称。

  Args:
    root: 二叉树的根节点。

  Returns:
    如果二叉树对称,返回 True。否则,返回 False。
  """

  # 如果二叉树为空,则它是对称的。
  if not root:
    return True

  # 如果二叉树只有一个节点,则它是对称的。
  if not root.left and not root.right:
    return True

  # 如果二叉树的左右子树都不为空,则递归地检查它们是否对称。
  if root.left and root.right:
    return is_symmetric(root.left) and is_symmetric(root.right) and root.left.val == root.right.val

  # 如果二叉树的左子树或右子树为空,则它不是对称的。
  return False

另一种检查二叉树是否对称的方法是使用广度优先搜索。我们可以从根节点开始,然后把它的左右子树加入队列中。然后,我们从队列中取出两个节点,并检查它们是否对称。如果它们对称,那么我们把它们的左右子树加入队列中。否则,我们跳过它们的子树。

def is_symmetric(root):
  """
  检查二叉树是否对称。

  Args:
    root: 二叉树的根节点。

  Returns:
    如果二叉树对称,返回 True。否则,返回 False。
  """

  # 如果二叉树为空,则它是对称的。
  if not root:
    return True

  # 创建一个队列,并把根节点加入队列中。
  queue = [root]

  # 循环,直到队列为空。
  while queue:
    # 从队列中取出两个节点。
    node1 = queue.pop(0)
    node2 = queue.pop(0)

    # 如果两个节点都不为空,则检查它们是否对称。
    if node1 and node2:
      if node1.val != node2.val:
        return False
      # 如果两个节点的左右子树都不为空,则把它们加入队列中。
      if node1.left and node2.right:
        queue.append(node1.left)
        queue.append(node2.right)
      # 如果两个节点的左右子树都为空,则跳过它们。
      elif not node1.left and not node2.right:
        continue
      # 如果两个节点的左右子树只有一个不为空,则二叉树不是对称的。
      else:
        return False

    # 如果两个节点中有一个为空,则二叉树不是对称的。
    elif node1 or node2:
      return False

  # 如果队列为空,则二叉树是