返回

用队列搞定完全二叉树

IOS

队列的力量

我们知道,在树的遍历中,除了常规的深度优先搜索(DFS)和广度优先搜索(BFS)外,还有很多其他值得探索的遍历方法。比如,层序遍历(Level Order Traversal)就是其中一种。

层序遍历从根节点开始,按层从上到下,从左到右依次访问所有节点。它的实现很简单,只需要借助一个队列即可。

def level_order_traversal(root):
  """
  层序遍历二叉树

  Args:
    root: 二叉树的根节点

  Returns:
    List[int]: 层序遍历的结果
  """

  result = []
  queue = [root]

  while queue:
    level_nodes = []
    for _ in range(len(queue)):
      node = queue.pop(0)
      level_nodes.append(node.val)
      if node.left:
        queue.append(node.left)
      if node.right:
        queue.append(node.right)

    result.append(level_nodes)

  return result

完全二叉树的判断

完全二叉树是一种特殊的二叉树,它满足以下两个条件:

  1. 除了最底层的节点外,其他每个节点都有左右子节点。
  2. 最底层的节点要么全部在同一层,要么只差一层。

利用层序遍历的方法,我们可以很容易地判断一棵二叉树是否为完全二叉树。

def is_complete_binary_tree(root):
  """
  判断二叉树是否为完全二叉树

  Args:
    root: 二叉树的根节点

  Returns:
    bool: True if the tree is a complete binary tree, False otherwise
  """

  if not root:
    return True

  queue = [root]
  has_null = False

  while queue:
    node = queue.pop(0)

    if node:
      if has_null:
        return False

      queue.append(node.left)
      queue.append(node.right)
    else:
      has_null = True

  return True

二叉树的高度

二叉树的高度是指从根节点到最深叶节点的最长路径的长度。

利用队列遍历的方法,我们可以很容易地计算二叉树的高度。

def height_of_binary_tree(root):
  """
  计算二叉树的高度

  Args:
    root: 二叉树的根节点

  Returns:
    int: 二叉树的高度
  """

  if not root:
    return 0

  queue = [root]
  height = 0

  while queue:
    level_size = len(queue)
    height += 1

    for _ in range(level_size):
      node = queue.pop(0)

      if node.left:
        queue.append(node.left)
      if node.right:
        queue.append(node.right)

  return height

结语

队列是一种非常有用的数据结构,它可以用于解决很多不同的问题。在本文中,我们探讨了利用队列遍历和队列处理手段来判断二叉树是否为完全二叉树以及计算二叉树的高度。这些方法简单易懂,并且具有很强的实用性。