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完全二叉树的构建,包含广度优先插入节点、广度遍历、先序、中序、后序遍历等函数。通过实例化节点、借助队列间接实现遍历、添加字符遍历来展示树结构等方法来实现。