返回

剑指 Offer 32 - 从上到下打印二叉树 III:遍历之美的层序印迹

闲谈

算法解析:逐层递进,左右交替

从上到下打印二叉树 III 的算法思想并不复杂,其核心在于分层遍历二叉树,并交替改变每一层的打印方向。具体步骤如下:

  1. 初始化:

    • 创建一个队列 queue 来存储要打印的节点。
    • 创建一个布尔变量 direction 来指示当前层的打印方向,初始值为 true(从左到右)。
  2. 层序遍历:

    • 将二叉树的根节点入队。
    • 循环遍历队列,直到队列为空。
    • 在每次循环中:
      • 从队列中取出所有节点并按当前层的打印方向打印它们的val值。
      • 将这些节点的子节点入队,注意左右子节点的入队顺序。
      • 切换 direction 的值,以改变下一层的打印方向。
  3. 打印完成:

    • 循环结束时,所有节点都已打印完毕。

代码实现:清晰简洁,层层递进

def level_order_III(root):
  if not root:
    return []

  # 初始化队列和打印方向
  queue = [root]
  direction = True

  # 层序遍历二叉树
  result = []
  while queue:
    level_values = []

    # 按照当前层的打印方向打印节点值
    if direction:
      for node in queue:
        level_values.append(node.val)
    else:
      for node in reversed(queue):
        level_values.append(node.val)

    # 将下一层的节点入队
    next_level_nodes = []
    for node in queue:
      if node.left:
        next_level_nodes.append(node.left)
      if node.right:
        next_level_nodes.append(node.right)

    # 切换打印方向
    direction = not direction

    # 将当前层的节点值添加到结果列表
    result.append(level_values)

    # 更新队列
    queue = next_level_nodes

  return result

示例输入与输出:

# 示例二叉树
        1
       / \
      2   3
     / \ / \
    4   5 6   7

# 调用函数打印二叉树
result = level_order_III(root)

# 打印结果
for level in result:
  print(level)

输出:

[1]
[3, 2]
[4, 5, 6, 7]

结语:层层递进,左右交替

剑指 Offer 32 - 从上到下打印二叉树 III 问题的关键在于理解分层遍历二叉树并交替改变打印方向的思想。通过这种方法,我们可以以之字形顺序打印二叉树,满足题目要求。希望本文对您理解算法并编写代码有所帮助。

剑指 Offer 系列题目是算法面试中的经典题集,它们往往涉及到各种数据结构和算法知识。通过不断地练习和深入理解这些题目,您可以显著提高自己的算法能力和编程技巧。祝您在算法学习的道路上不断进步,取得骄人的成绩!