树的概念
树(英语:tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合
4个特点
每个节点有零个或多个子节点;
没有父节点的节点称为根节点;
每一个非根节点有且只有一个父节点;
除了根节点外,每个子节点可以分为多个不相交的子树
E没有父节点, 它是根节点
A, F是E的子节点
其中也是BCD的父节点,
然后BCD称为兄弟节点
最下面的是叶子节点或叶节点
高度(Height)、深度(Depth)、层(Level)
节点高度:叶子节点到其节点的个数(一般从0开始)
树的高度:叶子节点到根节点的个数(一般从0开始)
节点的深度:从节点到哦叶子节点的个数(一般从0开始)
节点的层:节点到叶子节点的个数(一般从1开始)也有资料说从0开始,不过没有影响
树的种类
无序树:树中任意节点的子节点之间没有顺序关系,这种树称为无序树,也称为自由树
有序树:节点之间有顺序关系
有序树又分为:二叉树. 霍夫曼树****B树
**霍夫曼树(用于信息编码):**带权路径最短的二叉树称为哈夫曼树或最优二叉树;
**B树:**一种对读写操作进行优化的自平衡的二叉查找树,能够保持数据有序,拥有多余两个子树
二叉树
**二叉树:**每个节点最多含有两个子树的树称为二叉树;
完全二叉树:对于一颗二叉树,假设其深度为d(d>1)。除了第d层外,其它各层的节点数目均已达最大值,且第d层所有节点从左向右连续地紧密排列,这样的二叉树被称为完全二叉树,其中满二叉树的定义是所有叶节点都在最底层的完全二叉树;
**平衡二叉树(AVL树):**当且仅当任何节点的两棵子树的高度差不大于1的二叉树;
排序二叉树(二叉查找树(英语:Binary Search Tree),也称二叉搜索树、有序二叉树);
实现广度优先
class Node(object):
def __init__(self, item, left_item = None, right_item = None):
self.item = item
self.left_item = left_item
self.right_item = right_item
class Tree(object):
def __init__(self, root = None):
self.root = root
def add(self, item):
node = Node(item)
if self.root == None:
self.root = node
else:
queue = []
queue.append(self.root)
while queue:
cur = queue.pop(0)
if cur.left_item == None: #左如果为空,就加在左边
cur.left_item = node
return
elif cur.right_item == None:#右边如果为空,就加在右边
cur.right_item = node
return
else: #如果都不为空,就加入列表继续判断
queue.append(cur.left_item)
queue.append(cur.right_item)
def breach(self):
if self.root == None:
return
else:
queue = []
queue.append(self.root)
while queue:
node = queue.pop(0)
print(node.item, end = " ")
if node.left_item != None: #如果不为空就加入列表弹出
queue.append(node.left_item)
if node.right_item != None:
queue.append(node.right_item)
if __name__ == '__main__':
tree = Tree()
tree.add(0)
tree.add(1)
tree.add(2)
tree.breach()
深度优先(重点)
分为先序遍历…中序遍历…后序遍历
这个先后是相对于根节点来说的, 对应分别是根节点先中后, 就是根节点打印顺序不同, 都是先打印左节点在打印右节点
代码实现
def preorder(self, node):
"""递归实现先序遍历"""
if node == None:
return
print(node.item, end=" ")
self.preorder(node.left_item)
self.preorder(node.right_item)
def inorder(self, node):
"""递归实中序遍历"""
if node == None:
return
self.inorder(node.left_item)
print(node.item, end=" ")
self.inorder(node.right_item)
def postorder(self, node):
"""递归实现后序遍历"""
if node == None:
return
self.postorder(node.left_item)
self.postorder(node.right_item)
print(node.item, end=" ")