Python实现普通二叉树
二叉树是每个节点最多有两个子树的树结构,本文使用Python来实现普通的二叉树。
关于二叉树的介绍,可以参考:https://blog.csdn.net/weixin_43790276/article/details/104737870
一、实现节点类
所有树结构都是由一个一个的节点构成的,本文使用链式的方式来实现二叉树,所以先实现一个节点类。
# coding=utf-8
class Node(object):
"""节点类"""
def __init__(self, data, left_child=None, right_child=None):
self.data = data
self.parent = None
self.left_child = left_child
self.right_child = right_child
在二叉树中添加节点时,要先创建节点,有了节点类,实例化一个节点类的实例即可,节点初始化时是一个孤立的节点,指向的父节点、左子节点、右子节点都为空。将节点“挂”到树上(添加到树中)后,才属于树的一部分。
二、实现二叉树类
实现一个二叉树的类 BinaryTree ,创建二叉树时,实例化一个 BinaryTree 类的实例即可。
class BinaryTree(object):
"""二叉树类"""
def __init__(self):
self.__root = None
self.prefix_branch = '├'
self.prefix_trunk = '|'
self.prefix_leaf = '└'
self.prefix_empty = ''
self.prefix_left = '─L─'
self.prefix_right = '─R─'
def is_empty(self):
return not self.__root
@property
def root(self):
return self.__root
@root.setter
def root(self, data):
self.__root = Node(data)
def show_tree(self):
if self.is_empty():
print('空二叉树')
return
print('-' * 20)
print(self.__root.data)
self.__print_tree(self.__root)
print('-' * 20)
def __print_tree(self, node, prefix=None):
if prefix is None:
prefix, prefix_left_child = '', ''
else:
prefix = prefix.replace(self.prefix_branch, self.prefix_trunk)
prefix = prefix.replace(self.prefix_leaf, self.prefix_empty)
prefix_left_child = prefix.replace(self.prefix_leaf, self.prefix_empty)
if self.has_child(node):
if node.right_child is not None:
print(prefix + self.prefix_branch + self.prefix_right + str(node.right_child.data))
if self.has_child(node.right_child):
self.__print_tree(node.right_child, prefix + self.prefix_branch + ' ')
else:
print(prefix + self.prefix_branch + self.prefix_right)
if node.left_child is not None:
print(prefix + self.prefix_leaf + self.prefix_left + str(node.left_child.data))
if self.has_child(node.left_child):
prefix_left_child += ' '
self.__print_tree(node.left_child, self.prefix_leaf + prefix_left_child)
else:
print(prefix + self.prefix_leaf + self.prefix_left)
def has_child(self, node):
return node.left_child is not None or node.right_child is not None
def __str__(self):
return str(self.__class__)
一棵二叉树,只要先找到树的根节点(Root),就可以依次根据节点的父子关系找到所有节点,所以初始化一棵二叉树时,只要先指向树的根节点即可,在没有添加节点到二叉树中时,树是一棵空二叉树,树的根指向为空。
在初始化二叉树时,树的根设置为私有属性,这样做是有必要的,保证根节点的稳定。但是又需要通过实例对象来操作树的根,所以使用 @property 加 @root.setter 提供一对方法供实例对象使用,可以获取或设置二叉树的根节点。
同时,还实现了判断二叉树是否为空的 is_empty() 方法和按树形结构打印二叉树的 show_tree() 方法,在实现完全二叉树的另一篇文章里面有说明。可以参考:https://blog.csdn.net/weixin_43790276/article/details/104033490
三、二叉树添加节点

本文详细介绍了如何使用Python实现二叉树数据结构,包括节点类和二叉树类的定义,以及添加节点、遍历、获取高度、叶节点和节点数等核心功能。
6577

被折叠的 条评论
为什么被折叠?



