树(英语:tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。
它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵
倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:
节点的度: 一个节点含有的子树的个数称为该节点的度;
树的度: 一棵树中,最大的节点的度称为树的度;
叶节点或终端节点, 父亲节点或父节点, 孩子节点或子节点, 兄弟节点
1). 如果二叉树中除了叶子结点,每个结点的度都为 2,则此二叉树称为满二叉树。
2). 如果二叉树中除去最后一层节点为满二叉树,且最后一层的结点依次从左到右分布,则此二叉树被称为完全二叉树。
顺序存储: 将数据结构存储在固定的数组中,然在遍历速度上有一定的优势,但因所占空间比较大,是非主流二叉树。二叉树通常以链式存储。
class Node(object):
"""节点类"""
def __init__(self, elem=-1, lchild=None, rchild=None):
self.elem = elem
self.lchild = lchild
self.rchild = rchild
class Tree(object):
"""树类"""
def __init__(self, root=None):
self.root = root
def add(self, elem):
"""为树添加节点"""
node = Node(elem)
#如果树是空的,则对根节点赋值
if self.root == None:
self.root = node
else:
queue = []
queue.append(self.root)
#对已有的节点进行层次遍历
while queue:
#弹出队列的第一个元素
cur = queue.pop(0)
if cur.lchild == None:
cur.lchild = node
return
elif cur.rchild == None:
cur.rchild = node
return
else:
#如果左右子树都不为空,加入队列继续判断
queue.append(cur.lchild)
queue.append(cur.rchild)
遍历是指对树中所有结点的信息的访问,即依次对树中每个结点访问一次且仅访问一次,我们把这种对所有节点的访问称为遍历(traversal)
def breadth_travel(self, root)
"""层次遍历"""
if root == None:
return
queue = []
queue.append(root)
while queue:def breadth_travel(self, root):
"""利用队列实现树的层次遍历"""
node = queue.pop(0)
print(node.elem,end=",")
if node.lchild != None:
queue.append(node.lchild)
if node.rchild != None:
queue.append(node.rchild)
print()
中序遍历: 4 2 5 1 6 3 7
后序遍历: 4 5 2 6 7 3 1
每遇到一个节点,先访问,然后再遍历其左右子树
def preorder(self, root):
"""递归实现先序遍历"""
if root == None:
return
print(root.elem)
self.preorder(root.lchild)
self.preorder(root.rchild)
第一次经过时不访问根节点,等遍历完左子树之后再访问,然后遍历右子树
def inorder(self, root):
"""递归实现中序遍历"""
if root == None:
return
self.inorder(root.lchild)
print(root.elem, end=',')
self.inorder(root.rchild)
第一次和第二次经过时都不访问,等遍历完该节点的左右子树之后,最后访问该节点
def postorder(self, root):
"""递归实现后续遍历"""
if root == None:
return
self.postorder(root.lchild)
self.postorder(root.rchild)
print(root.elem, end=',')