返回
从上到下打印二叉树 II:揭秘分层遍历算法的奥秘
前端
2023-09-28 11:24:52
序言:
身处科技浪潮之中,算法已成为不可或缺的利器。作为算法修炼场之一的 leetcode,吸引着众多程序员不断挑战自我。今天,让我们共同探索剑指 Offer 32 - II 这道经典题目,揭开分层遍历算法的神秘面纱。
一、二叉树的结构与遍历:
二叉树是一种数据结构,由结点和边构成。每个结点包含一个数据域和最多两个子结点,分别称为左子结点和右子结点。二叉树的遍历有不同的方式,分层遍历是一种常见的遍历方式。
二、分层遍历算法:
分层遍历算法的目标是按层级顺序访问二叉树中的所有结点。其核心思想是使用队列数据结构,将结点按照层级依次入队和出队。具体步骤如下:
- 初始化队列,并把根结点入队。
- 循环执行以下操作,直到队列为空:
- 将队首结点出队并访问。
- 如果队首结点有左子结点,则将左子结点入队。
- 如果队首结点有右子结点,则将右子结点入队。
三、剑指 Offer 32 - II 解题思路:
剑指 Offer 32 - II 要求分层遍历一棵二叉树,并返回每一层结点的值。我们可以直接套用分层遍历算法,实现步骤如下:
- 初始化队列,并把根结点入队。
- 创建一个结果列表,用于存储每一层结点的值。
- 循环执行以下操作,直到队列为空:
- 获取当前队列的大小,表示当前层的结点数。
- 创建一个临时列表,用于存储当前层的结点值。
- 循环遍历当前层的结点数,执行以下操作:
- 将队首结点出队并访问。
- 把当前结点的值添加到临时列表中。
- 如果当前结点有左子结点,则将左子结点入队。
- 如果当前结点有右子结点,则将右子结点入队。
- 把临时列表添加到结果列表中。
- 返回结果列表。
四、代码实现:
def level_order_ii(root):
if not root:
return []
result = []
queue = [root]
while queue:
level_size = len(queue)
level_values = []
for _ in range(level_size):
node = queue.pop(0)
level_values.append(node.val)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
result.append(level_values)
return result
五、结语:
通过对剑指 Offer 32 - II 的深入剖析,我们不仅掌握了分层遍历算法的精髓,也为自己的算法技能库添上了一块新砖。算法的学习是一个不断探索和实践的过程,愿我们都能在算法的海洋中乘风破浪,不断提升自我。