1. 算法思想:
1) 初始化一个辅助队列(先进先出)
2) 根节点入队
3) 若队列非空, 则队头节点出队, 访问该节点, 并将其左、右孩子树插入队尾(如果有的话)
2. 图解
3. 代码实现
1) Step1: 先定义一个节点类
# 1. 定义Node类, 表示: 节点类.
class Node:
# 初始化节点的数据
def __init__(self, item) -> None:
self.item = item # 元素域, 存: 数值的.
self.lchild = None # 地址域, 存: 左子节点.
self.rchild = None # 地址域, 存: 右子节点
2)Step2: 定义一个二叉树类, 并定义广度优先遍历的方法.
# 2. 定义BinaryTree, 表示二叉树类.
class BinaryTree:
# 2.1 指定二叉树的 根节点.
def __init__(self, root=None) -> None:
self.root = root # root: 充当根节点
# 2.2 添加元素
def add(self, item):
"""
自定义代码, 实现往: 自定义二叉树中添加数据.
:param item: 要添加的数据
:return:
"""
# 1. 判断根节点是否为空, 若为空, 直接将当前元素设置为: 根节点, 程序结束.
if self.root == None:
self.root = Node(item)
return
# 2. 走到这里, 说明根节点不为空, 我们准备列表, 用于存储: 二叉树中所有的节点.
queue = []
queue.append(self.root)
# 3. 通过while True, 不断的获取到二叉树中的节点.
while True:
cur_node = queue.pop(0) # 获取节点的.
# 4. 判断当前节点的 左子树(左子节点)是否为空.
if cur_node.lchild == None:
# 4.1 若为空, 则将: 新节点添加为当前节点的 左子树
cur_node.lchild = Node(item)
return
else:
# 4.2 如果不为空, 则将: 当前节点的左子树加到 队列中.
queue.append(cur_node.lchild)
# 5. 判断当前节点的 右子树(右子节点)是否为空.
if cur_node.rchild == None:
# 5.1 若为空, 则将: 新节点添加为当前节点的 右子树
cur_node.rchild = Node(item)
return
else:
# 5.2 如果不为空, 则将: 当前节点的右子树加到 队列中.
queue.append(cur_node.rchild)
# 2.3 遍历, 广度优先.
def breadth_travle(self):
# 1. 判断根节点是否为空.
if self.root == None:
return
# 2. 创建队列(queue), 用于存储: 二叉树的元素.
queue = []
queue.append(self.root) # 添加根节点到队列中.
# 3. 循环获取元素(节点), 只要队列不为空(说明还有二叉树节点), 就一直遍历.
while len(queue) > 0:
# 3.1 走这里, 说明队列有数据, 我们从(队头)获取元素.
node = queue.pop(0)
# 3.2 打印当前节点的内容.
print(node.item, end=' ')
# 3.3 判断当前节点是否有左子树, 有就添加到 队列中.
if node.lchild is not None:
queue.append(node.lchild)
# 3.4 判断当前节点是否有右子树, 有就添加到 队列中.
if node.rchild is not None:
queue.append(node.rchild)
3)Step3: 在main函数中, 完成测试.
# 3. 在main哈数中测试
if __name__ == '__main__':
# 3.1 创建二叉树.
bt = BinaryTree()
# 3.2 添加元素.
bt.add('A')
bt.add('B')
bt.add('C')
bt.add('D')
bt.add('E')
bt.add('F')
bt.add('G')
bt.add('H')
bt.add('I')
bt.add('J')
bt.add('K')
bt.add('L')
# 3.3 广度优先遍历, 查看结果.
bt.breadth_travle()
# 输出结果:A B C D E F G H I J K L