如何用python实现完全二叉树

1 问题

根据二叉树的结构特点,二叉树是由一个个的节点构成的,节点与节点之间通过父子关系链接在一起,所以,二叉树通常以链式方式存储。在一棵普通的二叉树中,节点的排列不一定是从上到下、从左到右依次排列的。满足从上到下、从左到右依次排列的二叉树是完全二叉树。那么如何来用Python实现二叉树呢?

2 方法

完全二叉树由一个个节点组成,先实现一个节点的类 Node 类。创建节点时,实例化一个节点类的实例即可,节点初始化时是一个孤立的节点,指向的父节点、左子节点、右子节点都为空。将节点“挂”到树上(添加到树中)后,才属于树的一部分。一棵二叉树,只要先找到树的根节点(Root),就可以依次根据节点的父子关系找到所有节点,所以初始化一棵二叉树时,只要先指向树的根节点即可。在还没有添加节点到二叉树中时,树是一棵空二叉树,所以指向为空。先实现is_empty()方法: 判断树是否为一棵空二叉树,如果树的根指向为空(对应布尔值False),则树为空二叉树(is_empty为True),反之。

通过实验、实践等证明提出的方法是有效的,是能够解决开头提出的问题。

代码清单 1

class Node(object):
"""节点"""
def __init__(self, item):
self.elem = item
self.lchild = None
self.rchild = None
 
class Tree(object):
"""二叉树"""
def __init__(self):
self.root = None
self.preorder_list = []
self.inorder_list = []
self.postorder_list = []

def add(self, item):
"""
插入树节点
广度优先
"""
node = Node(item)
if self.root == None:
self.root = node
return
queue = [self.root]
while queue:
cur_node = queue.pop(0)
if cur_node.lchild == None:
cur_node.lchild = node
return
else:
queue.append(cur_node.lchild)
if cur_node.rchild == None:
cur_node.rchild = node
return
else:
queue.append(cur_node.rchild)

def breadth_travel(self):
"""
广度遍历
"""
if self.root == None:
return []
queue = [self.root]
ls = [self.root.elem]
while queue:
cur_node = queue.pop(0)
if cur_node.lchild == None:
return ls
else:
ls.append(cur_node.lchild.elem)
queue.append(cur_node.lchild)
if cur_node.rchild == None:
return ls
else:
ls.append(cur_node.rchild.elem)
queue.append(cur_node.rchild)
 
def is_empty(self):
"""
判断树是否为空
"""
if self.root == None:
print(True)
else:
print(False)
 
def list_add(self, add_list):
"""
输入列表快速添加树节点
"""
for i in add_list:
self.add(i)
 
def pre(self, node):
"""
先序遍历
根 左 右
"""
if node == None:
return
self.preorder_list.append(node.elem)
self.pre(node.lchild)
self.pre(node.rchild)
def preorder(self):
self.pre(self.root)
return self.preorder_list
 
def mid(self, node):
"""
中序遍历
左 根 右
"""
if node == None:
return 
self.mid(node.lchild)
self.inorder_list.append(node.elem)
self.mid(node.rchild)
def inorder(self):
self.mid(self.root)
return self.inorder_list
 
def pos(self, node):
"""
后序遍历
左 右 根
"""
if node == None:
return
self.pos(node.lchild)
self.pos(node.rchild)
self.postorder_list.append(node.elem)
def postorder(self):
self.pos(self.root)
return self.postorder_list
 
if __name__ == "__main__":
tree = Tree()
tree.list_add([0,1,2,3,4,5,6,7,8,9])
tree.add(10)
ls=tree.breadth_travel()
print(ls)
ls = tree.preorder()
print(ls)
ls=tree.inorder()
print(ls)
ls=tree.postorder()
print(ls)

3 结语

通过实验发现,可以使用Python来实现完全二叉树。而Python完全二叉树的构建,包含广度优先插入节点、广度遍历、先序、中序、后序遍历等函数。通过实例化节点、借助队列间接实现遍历、添加字符遍历来展示树结构等方法来实现。

你可能感兴趣的:(python,windows,开发语言)