什么是层序遍历?

级别顺序遍历(Level Order Traversal),也称为层序遍历,是二叉树遍历的一种方法。这种方法按照从上到下、从左到右的顺序遍历二叉树的每一层节点。

树是一种非线性数据结构。这些树由按分层结构排列的节点组成。它从单个根节点开始,该根节点可以有自己的子节点。所有节点都在边的帮助下连接起来。使用树,我们可以将信息存储在层次结构中。根据每个节点的子节点数,树分为不同的类型。

层序遍历的特点和过程

从上到下:层序遍历从根节点开始,然后逐层向下遍历。

从左到右:在同一层中,从左到右依次访问节点。

使用队列:通常使用队列来实现层序遍历,将每一层的节点依次入队,然后出队并访问。

什么是遍历?

遍历是逐级访问树的每个节点,直到搜索完所有节点的过程。Level order 遍历是一种用于广度优先二叉树的遍历技术。二叉树是每个节点最多可以有两个子节点的树。

遍历从根节点开始。然后,我们前进到根节点的子节点,然后是它的子节点,依此类推,直到遍历完所有叶节点。对树使用广度优先遍历,我们从根节点遍历图形,并逐渐向其相邻节点移动。在移动到下一个深度之前,我们会检查特定深度存在的所有节点。

让我们通过以下树的示例来理解遍历

AIGC涉及到的算法-之-层序遍历_非线性数据结构

此处,节点 '0' 是根节点,其中节点 '1' 和节点 '2' 是其子节点。节点 '1' 是左子节点,节点 '2' 是右子节点。由于它是二叉树,因此每个节点最多可以有两个子节点。然后,节点 '3' 和节点 '4' 是节点 '1' 的子节点。节点 '5' 和节点 '6' 是节点 '2' 的子节点。

遍历结果

0 1 2 3 4 5 6 

首先,我们将遍历节点 '0',然后遍历其子节点 – 节点 '1' 和节点 '2'。之后,我们将遍历节点 '1' – 节点 '3' 和节点 '4' 的子节点。然后,最后,我们将遍历节点 '2' – 节点 '5' 和节点 '6' 的子节点。遍历所有节点都完成后将停止。

用于级别顺序遍历的 Python 代码

如上所述,我们将使用队列执行级别顺序遍历。我们将对以下树执行遍历:

AIGC涉及到的算法-之-层序遍历_层序遍历_02

此处,节点 'A' 是根节点。它有两个子节点 – 节点 'B' 是左子节点,节点 'C' 是右子节点。节点“B”有两个子节点——节点“D”和节点“E”。而节点“C”只有一个子节点——节点“F”。

定义类

首先,我们将定义一个名为 'Tree' 的类。

class Tree:
  def __init__(self,node):
    self.node = node
    self.left = None
    self.right = None

我们将定义 __init__() 方法,它将接受两个参数 – self 和 node。我们已经将 self.node 初始化为 node。最初,self.left 和 self.right 将为 None。self.left 和 self.right 分别代表根节点 self.node 的左右子节点。

定义遍历函数

然后,我们将在类之外定义一个名为 'Level_Order_Traversal' 的函数。

def Level_Order_Traversal(root):
  traversed = []
  traversed.append(root)
 
  if root is None:
    return traversed
     
  while traversed != []:
    print(traversed[0].node)
    x = traversed.pop(0) 
     
 
    if x.left:
      traversed.append(x.left)
 
    if x.right:
      traversed.append(x.right)

该函数只接受一个参数 – 'root',它表示根节点。我们有一个名为 'traversed' 的列表,它充当队列。首先,我们将 root 附加到列表,它实际上是一个类对象。然后,我们将检查我们的根是否为空。如果为空,那么我们将返回空队列 'traveld'。

之后,我们将迭代一个 while 循环,该循环将一直运行到遍历的列表变为空。我们将使用 'print(traversed[0].node)' 打印根节点。

对于列表的第一个元素,它将打印其值。之后,我们将从列表中弹出打印的元素并将其保存到名为 'x' 的变量中。然后,我们将检查从队列 'traversed' 中弹出的节点是否有任何剩余的子节点。

如果有,那么我们应该将左子节点附加到 'traversed' 中。同样,我们还将检查正确的子节点。

创建类对象

首先,我们将创建根 'A'。然后使用 left 和 right 属性,我们将创建整个树。之后,我们将通过将 root 作为参数传递给 Level_Order_Traversal() 函数来调用它。

root = Tree('A')
root.left = Tree('B')
root.right = Tree('C')
root.left.left = Tree('D')
root.left.right = Tree('E')
root.right.left = Tree('F')
 
Level_Order_Traversal(root)

输出为:

A
B
C
D
E
F

方法一:完整程序

class Tree:
  def __init__(self,node):
    self.node = node
    self.left = None
    self.right = None
 
   
 
def Level_Order_Traversal(root):
  traversed = []
  traversed.append(root)
 
  if root is None:
    return traversed
     
  while traversed != []:
    print(traversed[0].node)
    x = traversed.pop(0) 
     
 
    if x.left:
      traversed.append(x.left)
 
    if x.right:
      traversed.append(x.right)
 
 
root = Tree('A')
root.left = Tree('B')
root.right = Tree('C')
root.left.left = Tree('D')
root.left.right = Tree('E')
root.right.left = Tree('F')
 
 
Level_Order_Traversal(root)

方法二:完整代码

AIGC涉及到的算法-之-层序遍历_非线性数据结构_03

from queue import Queue
 
class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None
 
def level_order_traversal(root):
    if not root:
        return []
    
    result = []
    queue = Queue()
    queue.put(root)
 
    while not queue.empty():
        node = queue.get()
        result.append(node.val)
        if node.left:
            queue.put(node.left)
        if node.right:
            queue.put(node.right)
            
    return result
 
# 示例使用
root = TreeNode(0)
root.left = TreeNode(1)
root.right = TreeNode(2)
root.left.left = TreeNode(3)
root.left.right = TreeNode(4)
root.right.left = TreeNode(5) 
root.right.right = TreeNode(6) 
print(level_order_traversal(root))  # 输出: [0, 1, 2, 3, 4, 5, 6]