什么是层序遍历?
级别顺序遍历(Level Order Traversal),也称为层序遍历,是二叉树遍历的一种方法。这种方法按照从上到下、从左到右的顺序遍历二叉树的每一层节点。
树是一种非线性数据结构。这些树由按分层结构排列的节点组成。它从单个根节点开始,该根节点可以有自己的子节点。所有节点都在边的帮助下连接起来。使用树,我们可以将信息存储在层次结构中。根据每个节点的子节点数,树分为不同的类型。
层序遍历的特点和过程
从上到下:层序遍历从根节点开始,然后逐层向下遍历。
从左到右:在同一层中,从左到右依次访问节点。
使用队列:通常使用队列来实现层序遍历,将每一层的节点依次入队,然后出队并访问。
什么是遍历?
遍历是逐级访问树的每个节点,直到搜索完所有节点的过程。Level order 遍历是一种用于广度优先二叉树的遍历技术。二叉树是每个节点最多可以有两个子节点的树。
遍历从根节点开始。然后,我们前进到根节点的子节点,然后是它的子节点,依此类推,直到遍历完所有叶节点。对树使用广度优先遍历,我们从根节点遍历图形,并逐渐向其相邻节点移动。在移动到下一个深度之前,我们会检查特定深度存在的所有节点。
让我们通过以下树的示例来理解遍历
此处,节点 '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 代码
如上所述,我们将使用队列执行级别顺序遍历。我们将对以下树执行遍历:
此处,节点 '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)
方法二:完整代码
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]