此代码讲解了向二叉树中 广度优先 添加元素的两种方式
1.添加单个节点
2.添加多个节点
# -*- coding:utf-8 -*-
"""
作者:bug君
日期:2023年 04月 05日
标题:
作用:
思路:利用 广度优先 向树中添加节点,广度优先利用到了队列的数据结构思想
"""
class Node:
def __init__(self, item):
self.elem = item
self.lchild = None
self.rchild = None
class Tree:
def __init__(self):
self.root = None
def add(self, item): # 用于向树中 添加一个元素
node = Node(item)
if self.root is None:
self.root = node
return
queue = [self.root] # 用列表代替queue操作
while queue:
curNode = queue.pop(0)
if curNode.lchild is None:
curNode.lchild = node
return
else:
queue.append(curNode.lchild)
if curNode.rchild is None:
curNode.rchild = node
return
else:
queue.append(curNode.rchild)
def addNodes(self, NewDatas): # 用于需要添加多个元素节点的情况
if self.root is None:
self.root = Node(NewDatas.pop(0))
queue = [self.root]
rank = True
while NewDatas: # 循环结束的条件为 添加列中无元素
curNode = queue.pop(0) # 需要遍历到,某个没有子节点的位置
if rank: # rank表示节点的更新条件
NewDate = Node(NewDatas.pop(0))
rank = False
if curNode.lchild is None:
curNode.lchild = NewDate
queue.append(NewDate)
if not NewDatas: # 防治措施:当添加列中无元素时,退出循环
break
NewDate = Node(NewDatas.pop(0)) # 当左节点被添加后, 更新待添加节点
rank = True # 此时的情况
else:
queue.append(curNode.lchild)
if curNode.rchild is None:
curNode.rchild = NewDate
queue.append(NewDate)
rank = True
else:
queue.append(curNode.rchild)
def breadth_travel(self): # 广度遍历
if self.root is None: # 默认树中有元素,防治措施
print('树中无元素,无法遍历')
return
queue = [self.root]
while queue:
curNode = queue.pop(0)
print(curNode.elem)
if curNode.lchild is not None:
queue.append(curNode.lchild)
if curNode.rchild is not None:
queue.append(curNode.rchild)
if __name__ == '__main__':
tree = Tree()
print("第0次遍历")
tree.breadth_travel()
tree.add(1)
print("第1次遍历")
tree.breadth_travel()
lis = [2, 3, 4, 5, 6, 7]
tree.addNodes(lis)
print("第2次遍历")
tree.breadth_travel()