树和二叉树
什么是树
树是一种非线性的数据结构,由n个节点构成的有限集合,节点数0的树叫空树,在任意一棵树中,有且仅有一个特点的称为根节点,当N>1时,其余节点可分m为互不相交的有限集。
例如如下:
class Tree:
def __init__(self, af=0, mid=None, ru=None):
self.af = af
self.mid = mid
self.ru = ru
什么是二叉树
二叉树是树的一种特殊形式,每个节点有两个子节点,最多两个,也有1哥
class node :
def __init__(self,ru,su=None,bu=None):
self.ru =ru
self.su =su
self.bu = bu
class tree:
def __init__(self,rut=None):
self.rut = rut
二叉树如何用
二叉树主要应用于查找操作和维持相对顺序
二叉查找树
二叉查找树仔二叉树上增加几个条件
1。如果左子树不为空,则右子树上所有的节点的值均小于根节点的值
2。如果右子树不为空,则右子树上所有的节点的值均大于根节点的值
3。左子树,右子树都是二叉查找树
对于一个节点分布相对均衡的二叉查找树来说,如果节点总数是n,那么搜索节点时间复杂度就是O(logn),和树的深度一样。
二叉树如何遍历
为什么要遍历?
遍历本身是一个线性操作,所以遍历同样具有线性结构的数组和链表是一件轻而易举的事情。
二叉树的遍历分为四种:先序遍历,中序遍历,后序遍历,层序遍历
宏观角度看,二叉树的遍历归类为:1。深度遍历(前序遍历、中序遍历、后序遍历)、广度优先遍历
深度优先遍历
也可以用binarytree插件来实现
from binarytree import Node
root = Node(1)
root.left = Node(2)
root.right = Node(3)
root.left.left = Node(4)
root.left.right = Node(5)
root.right.right = Node(6)
print(root)
相关binarytree用法参考这篇文章
后面print(root.preorder)即可使用先序遍历顺序
from binarytree import Node
root = Node(1)
root.left = Node(2)
root.right = Node(3)
root.left.left = Node(4)
root.left.right = Node(5)
root.right.right = Node(6)
print(root.inorder)#中序遍历
from binarytree import Node
root = Node(1)
root.left = Node(2)
root.right = Node(3)
root.left.left = Node(4)
root.left.right = Node(5)
root.right.right = Node(6)
print(root)
print(root.postorder)
广度优先遍历
层序遍历
from binarytree import Node
root = Node(1)
root.left = Node(2)
root.right = Node(3)
root.left.left = Node(4)
root.left.right = Node(5)
root.right.right = Node(6)
print(root)
print(root.levelorder)
什么是二叉堆
二叉堆本质上是一种完全二叉树,分为最大堆和最小堆
最大堆的任何一个父节点的值都大于或等于右孩子或左孩子节点的值
最小堆的任何一个父节点的值,都小于或等于他的左孩子或右孩子的值。
二叉堆的根节点叫堆顶
最大堆和最小堆的特点决定了,最大堆的堆顶的堆顶使整个堆中的最大元素,最小堆的堆顶使整个堆中的最小元素。
from binarytree import Node
root = Node(1)
root.left = Node(3)
root.right = Node(2)
root.right.left = Node(7)
root.right.right =Node(8)
root.left.left = Node(6)
root.left.right = Node(5)
root.left.left.left = Node(9)
root.left.left.right = Node(10)
root.left.right.right = Node(0)
print(root)
什么是优先队列
优先队列分为最大优先队列和最小优先队列
最大优先队列,无论入队顺序如何,都是当前最大的元素优先出队
最小优先队列,无论入队顺序如何,都是当前最小的元素优先出队
优先队列的特点
优先队列具有队列的所有特性,包括队列的基本操作
优先队列如何实现?
在python中可以用到queue来实现队列优先级的尝试
import queue
# 定义元素对象
class test(object):
def __init__(self, pr, name):
self.pr = pr
self.name = name
def __str__(self):
return "test(priority={p}, name={n})".format(p=self.pr, n=self.name)
def __lt__(self, other):
""" 定义<比较操作符。"""
# 从大到小排序
return self.pr > other.pr
tsq = queue.PriorityQueue()
# 插入元素
tsq.put_nowait(test(10, "task1")) # 先进队列中最大值先出列
tsq.put_nowait(test(1, "task2"))
tsq.put_nowait(test(5, "task3"))
print("未优先队列之前:")
for item in tsq.queue:
print(item)
print("最大元素优先出列")
print(tsq.get())
print("最大元素出列后剩余元素:")
for item in tsq.queue:
print(item)
可以看到最大元素10就已经出列,10出列之后,剩余元素5为最大值,所以元素5的顺序排位就调高到最高为止,接下来出列的就是5。