class Node:
'''节点类:树是对链表的扩充,所以也有节点类'''
def __init__(self,item): #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):
#广度遍历添加,对节点的遍历和操作始终是左边(root,队头)取元素,右边(队尾)添加元素,联想到可以套用队列的思想
#如果根节点也为空,直接将要添加的节点放到根节点位置
if self.root is None:
self.root = node
return #节点插入完,直接退出函数
#有根节点的情况
#建立一个队列,用来取节点和添加节点
#将根节点放到队列中,为接下来向后遍历做准备
queue = [self.root]
#给当前节点添加子节点:肯定是从根节点开始处理
#从队列头取节点
cur_node = queue.pop(0)
#循环遍历队列:1.直到找到要添加节点的位置,2。若不为空则将子节点添加到队列中以便之后给他添加子节点
#循环结束条件是队列被取出元素为空时
while queue:
#如果当前节点左边的子节点是空,将构造出来的node挂到左边,然后退出
if cur_node.lchild is None:
cur_node.lchild = node
return
#如果左子节点存在,准备对其进行添加子节点的操作,将左孩子添加到队列尾
else:
queue.append(cur_ndoe.lchild)
#左子节点存在
#查看右子节点情况并进行操作
#如果右子节点为空,将当前节点的右子节点挂上去,并直接结束当前add函数
if cur_node.rchild is None:
cur_node.rchild = node
return
#否则说明右子节点存在,将右子节点添加到队列中准备对其进行添加子节点操作
else:
queue.append(cur_node.rchild)
#遍历:广度(层次)遍历,使用队列的思想
def breadth_travle(self):
#没根节点的情况
if self.root is None:
return
queue = [self.root]
while queue: #循环遍历,一直到队列中没有节点为止
cur_node = queue.pop(0)
print(cur_node.elem,end=' ') #打印出遍历到的元素
#将cur_elem的子节点添加到队列中
if cur_node.lchild is not None:
queue.append(cur_node.lchild)
if cur_node.rchild is not None:
queue.append(cur_node.rchild)
#遍历:深度遍历 -- 先序遍历:根-左-右
#先输出所有树的根,再从左边最小的那颗树开始输出左和右
#采用递归,每次遍历的时候root都在变,所以
def preorder(self,node):
#递归退出条件:传进来递归的节点是None(说明到头了)
if node is None:
return
#流程:将当前元素打印出来
#遍历当前节点的左半部分
#遍历当前节点的右半部分
print(root,elem,end=' ')
self.preorder(node.lchild)
self.preorder(node.rchild)
#遍历:深度遍历 -- 中序遍历:左-根-右
def inorder(self,node):
if node is None:
return
self.inorder(node.lchild)
print(node.elem,end=' ')
self.inorder(node.rchild)
#遍历:深度遍历 --后序遍历:左-右-根
def postorder(self,node):
if node is None:
return
self.postorder(node.lchild)
self.postorder(node.rchild)
print(root,elem,end=' ')
if __name__ == '__main__':
tree = 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.breadth_travel() #遍历出来的结果就是1 2 3 4 5
print(' ') #换行,因为print默认会换行
#先序遍历,需要寻着树的根节点才能找到树,所以需要传入根节点
tree.preorder(tree.root) #0 1 3 7 8 4 9 2 5 6
print(' ')
#中序
tree.inorder(tree.root) #7 3 8 1 9 4 0 5 2 6
print(' ')
#后序
tree.postorder(tree.root) #7 8 3 9 4 1 5 6 2 0
二叉树 --python描述
最新推荐文章于 2020-11-28 14:39:22 发布