数据结构基础+python实现(五):树
树是一种二维的数据结构,可以用顺序表和链表实现,但是相比较而言,链表的结构和树比较接近,所以使用链表更为方便。
对于树,有些基本的分类:
无序树:树种任意节点的子节点之间没有顺序关系。
有序树:
1、二叉树,又包括完全二叉树、满二叉树、平衡二叉树、排序二叉树
2、哈夫曼树
3、B树
树的实现:
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 # 根节点,类似于链表的头结点
def add(self, item):
node = Node(item)
if self.root is None: # 如果为空树,直接添加;如果为空树,cur_node.lchild会报错
self.root = node
return
queue = [self.root]
while queue:
cur_node = queue.pop(0)
if cur_node.lchild is None:
cur_node.lchild = node
return
else:
queue.append(cur_node.lchild)
if cur_node,rchild is None:
cur_node.rchild = node
return
else:
queue.append(cur_node.rchild)
# 在树种添加一个节点,类似广度添加,使用一个队列进行待判断节点的存储
深度遍历(先序、中序、后序)
1、
def preorder(self, node):
"""先序遍历"""
if node is None:
return
print(node.elem)
self.preorder(node.lchild)
self.preorder(node.rchild)
# 如果遍历到叶子节点,先把叶子节点打印出来,然后node.lchild为None,终止递归
2、
def inorder(self, node):
"""中序遍历"""
if node is None:
return
self.inorder(node.lchild)
print(node.elem)
self.inorder(node.rchild)
3、
def postorder(self, node):
"""后序遍历"""
if node is None:
return
self.postorder(node.lchild)
self.postorder(node.rchild)
print(node.elem)