1.创建树,添加元素的时候,利用add(),利用队列的思想存储数据和添加数据(队列并不是二叉树,只是一种对二叉树数据访问的一种方式)
2.遍历二叉树,利用递归思想
"""
@desc:
二叉树的实现,类似于队列取值和增加值:
从二叉树中取值,观察是否存在左子树,如果存在,尾部添加左子树,进行后续分析;不存在将左子树指向新节点;
观察是否存在右子树,如果存在,尾部添加右子树,进行后续分析,不存在将右子树指向新节点
"""
"""定义新节点:存在元素存储区,左子后继节点,右子后继节点"""
class Node():
def __init__(self,item):
self.elem=item
self.lchil=None
self.rchil=None
"""创建一个二叉树,队列存储结构"""
class Tree():
"""创建一个根节点的属性"""
def __init__(self):
self.root=None
def add(self,item):
queue=[self.root]
#print("新添加元素后,根节点是{0}".format(self.root))
node=Node(item)
"""将根节点传入队列中,如果根节点是None,队列也不是空列表,所以严谨性判断,否则进行到下面循环会出现报错"""
if self.root is None:
self.root=node
return
"""从队列中读取一个元素,为cur_node,进行左子节点和右子节点分析"""
"弹元素,进行左子节点和右子节点的分析,添加元素的循环终点是队列是空列表"
while queue:
cur_node=queue.pop(0)
if cur_node.lchil is None:
"""如果左子节点是空值,直接将左子节点指向新节点,否则还需将左子节点指向的元素添加到队列中进行后续分析"""
cur_node.lchil=node
return #本次二叉树的目的就是添加新节点,一旦添加完毕,就进行返回,不在进行右子节点的分析
else:
queue.append(cur_node.lchil)
if cur_node.rchil is None:
"""如果右子节点是空值,直接将右子节点指向新的节点,否则还需将右子节点指向的元素添加到队列中进行后续分析"""
cur_node.rchil=node
return#同左子节点
else:
queue.append(cur_node.rchil)
print(queue)
def breadth_travel(self):
"""需要进行广度遍历,一层一层的遍历,左子节点和右子节点"""
queue=[self.root]
if self.root is None:
return
while queue:#循环结束的终止条件是队列为空,则遍历结束
cur_node=queue.pop(0)
"""打印出当前节点的元素值"""
print(cur_node.elem,end="")
if cur_node.lchil is not None:
"""如果左子节点存在的时候,需要将左子节点指向元素添加到队列中"""
queue.append(cur_node.lchil)
if cur_node.rchil is not None:
queue.append(cur_node.rchil)
def preorder(self,node):
"""进行先序遍历:根-左-右,调用该遍历方法的时候先传入根节点,表示根节点是什么"""
if node is None:#递归结束的终止条件是没有节点可以遍历
return
print(node.elem,end="")
"""递归遍历左子树,打印出左子节点的根节点"""
self.preorder(node.lchil)
"""递归遍历右子树,打印出右子节点的根节点"""
self.preorder(node.rchil)
def inorder(self,node):
"""进行中序遍历:左-根-右,调用该遍历方法的时候先传入根节点,表示根节点是什么"""
if node is None:#递归结束的终止条件是没有节点可以遍历
return
"""递归遍历左子树,打印出左子节点的根节点"""
self.inorder(node.lchil)
print(node.elem,end="")
"""递归遍历右子树,打印出右子节点的根节点"""
self.inorder(node.rchil)
def postorder(self,node):
"""进行后序遍历:左-右-根,调用该遍历方法的时候先传入根节点,表示根节点是什么"""
if node is None:#递归结束的终止条件是没有节点可以遍历
return
"""递归遍历左子树,打印出左子节点的根节点"""
self.postorder(node.lchil)
"""递归遍历右子树,打印出右子节点的根节点"""
self.postorder(node.rchil)
print(node.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)
print("进行广度遍历")
tree.breadth_travel()
print()
print("进行前序遍历")
tree.postorder(tree.root)
print()
print("进行中序遍历")
tree.inorder(tree.root)
print()
print("进行后序遍历")
tree.postorder(tree.root)
#########输出结果
进行广度遍历
0123456789
进行前序遍历
7839415620
进行中序遍历
7381940526
进行后序遍历
7839415620
Process finished with exit code 0