二叉树的广度优先遍历策略详解

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

  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值