返回

持续精进,破解算法难题:剑指Offer每日一题(1)

IOS

剑指Offer每日一题(1):判断是否为对称二叉树

题目:
给定一个二叉树,判断它是否是对称的。

对称二叉树是指左右子树的对称性相同。

解析:
判断二叉树是否对称,可以采用深度优先遍历或广度优先遍历两种方式。

深度优先遍历:

  1. 从根节点开始,分别递归地遍历左右子树。
  2. 在递归过程中,比较左右子树是否对称。
  3. 如果左右子树都为空,则对称。
  4. 如果左右子树只有一个为空,则不对称。
  5. 如果左右子树都不为空,则比较左右子树的根节点是否相等。
  6. 如果左右子树的根节点相等,则继续比较左右子树的左子树和右子树。
  7. 重复步骤2~6,直到比较完所有节点。

广度优先遍历:

  1. 将根节点放入队列中。
  2. 从队列中取出两个节点,分别比较它们是否相等。
  3. 如果两个节点都为空,则对称。
  4. 如果两个节点只有一个为空,则不对称。
  5. 如果两个节点都不为空,则比较它们的左子树和右子树。
  6. 将两个节点的左子树和右子树放入队列中。
  7. 重复步骤2~6,直到队列为空。

参考代码:

def is_symmetric(root):
  if not root:
    return True

  # 深度优先遍历
  def dfs(left, right):
    if not left and not right:
      return True
    if not left or not right:
      return False
    if left.val != right.val:
      return False
    return dfs(left.left, right.right) and dfs(left.right, right.left)

  return dfs(root.left, root.right)

# 广度优先遍历
def is_symmetric_bfs(root):
  if not root:
    return True

  queue = [root.left, root.right]
  while queue:
    left = queue.pop(0)
    right = queue.pop(0)

    if not left and not right:
      continue
    if not left or not right:
      return False
    if left.val != right.val:
      return False

    queue.append(left.left)
    queue.append(right.right)
    queue.append(left.right)
    queue.append(right.left)

  return True

总结:
判断二叉树是否对称,可以采用深度优先遍历或广度优先遍历两种方式。两种方式的实现原理基本相同,都可以有效地判断二叉树是否对称。在实际应用中,可以根据具体情况选择合适的方式。