# 树的单个结点
class Node:
def __init__(self,elem):
# 结点数据
self.elem = elem
# 左子树和右子树
self.lchild = None
self.rchild = None
# 二叉树的实现
class my_tree:
# 初始化空树
def __init__(self):
self.root = None
# 树添加元素,广度遍历 + 队列
def add(self,item):
# 创建新结点
node = Node(item)
# 特殊情况
if self.root is None:
self.root = node
return
else:
# 队列的方式实现,队列最开始存根
queue = [self.root]
# 循环处理队列,直到将新结点添加进树为止
while queue:
# 取出第一个未处理的结点
cur_node = queue.pop(0)
# 判断取出的结点有没有左或右
# 左结点是空,则添加新结点
if cur_node.lchild is None:
cur_node.lchild = node
return
else:
# 左结点不是空,则将左结点添加进队列
queue.append(cur_node.lchild)
if cur_node.rchild is None:
cur_node.rchild = node
return
else:
queue.append((cur_node.rchild))
# 广度遍历
# 广度遍历
def tree_travle(self):
if self.root is None:
return
else:
# 队列先存根结点
queue = [self.root]
while queue:
# 取第一个未处理的结点
cur_node = queue.pop(0)
print(cur_node.elem, end=' ')
if cur_node.lchild is not None:
queue.append(cur_node.lchild)
if cur_node.rchild is not None:
queue.append(cur_node.rchild)
# 深度遍历
# 深度遍历
# 先序 根左右
def xian(self, root):
if root == None:
return
else:
print(root.elem, end=' ')
# 递归
self.xian(root.lchild)
self.xian(root.rchild)
# 中序 左根右
def zhong(self,root):
if root == None:
return
else:
self.zhong(root.lchild)
print(root.elem,end=' ')
self.zhong(root.rchild)
# 后序 左右根
def hou(self,root):
if root == None:
return
else:
self.hou(root.lchild)
self.hou(root.rchild)
print(root.elem,end=' ')
if __name__ == '__main__':
tree = my_tree()
tree.add(0)
tree.add(1)
tree.add(2)
tree.add(3)
tree.add(4)
tree.add(5)
tree.add(6)
tree.add(7)
tree.add(8)
tree.add(9)
# 广度
tree.tree_travle()
print('')
# 先序
tree.xian(tree.root)
print('')
# 中序
tree.zhong(tree.root)
print('')
# 后序
tree.hou(tree.root)