复杂数据结构
堆
* capter1
- 堆是一个二叉树,其中每个父节点的值都小于等于其所有子节点的值。
- 数组heap[k]<=heap[2*k+1]
- 列表heap[k]<=heap[2*k+2]
- 整个堆中最小的元素总是位于二叉树的根节点
- Python中提供了heap模块提供相应的支持
import heapq
import random
data = list(range(10))
random.shuffle(data)
data
heap = []
for n in data:
heapq.heappush(heap,n)
heap
[0, 1, 2, 4, 6, 7, 3, 9, 5, 8]
heapq.heappush(heap,0.5)
heap
[0, 0.5, 2, 4, 1, 7, 3, 9, 5, 8, 6]
heapq.heappop(heap)
heap
[0.5, 1, 2, 4, 6, 7, 3, 9, 5, 8]
myheap = [1,2,3,4,5,7,9,0,10,333]
heapq.heapify(mylist)
myheap
[1, 2, 3, 4, 5, 7, 9, 0, 10, 333]
heapq.heapreplace(myheap,333)
myheap
[3, 4, 7, 0, 5, 333, 9, 1, 10, 333]
max_value = (a,b,c) =heapq.nlargest(3,myheap)
max_value
[333, 333, 10]
min_value = (a,b) = heapq.nsmallest(2,myheap)
min_value
[0, 1]
队列
- 队列的特点:FIFO(先进先出) LILO(后进后出)
- 应用场景:
- Python提供了queue模块和collections.deque模块支持队列的操作
import queue
q = queue.Queue()
q.put(0)
q.put(1)
q.put(2)
q.queue
<queue.Queue at 0x23a656ea688>
q.get()
0
q.queue
deque([1, 2])
q.get()
1
q.queue
deque([2])
后进先出队列
import queue
LiFoQueue = queue.LifoQueue(5)
LiFoQueue.put(1)
LiFoQueue.put(2)
LiFoQueue.put(3)
LiFoQueue.get()
3
LiFoQueue.get()
2
LiFoQueue.get()
1
优先级队列
import queue
PriQueue = queue.PriorityQueue(5)
PriQueue.put(3)
PriQueue.put(5)
PriQueue.put(1)
PriQueue.put(8)
PriQueue.queue
[1, 5, 3, 8]
PriQueue.get()
1
PriQueue.get()
3
PriQueue.get()
5
PriQueue.get()
8
自定义队列结构
class myQueue:
def __init__(self,size =10):
self._content = [ ]
self._size = size
self._current = 0
def setSize(self,size):
if size<self._current:
for i in range(size,self._current)[::-1]:
del self._content[i]
self._size=size
self._size = size
def put(self,v):
if self._current<self._size:
self._content.append(v)
self._current = self._current + 1
else:
print('The queue is full')
def get(self):
if self._content:
self._current = self._current -1
return self._content.pop(0)
else:
print('This queue is empty!')
def show(self):
if self._content:
print(self._content)
else:
print("This queue is empty!")
def clear(self):
self._content= [ ]
def isEmpty(self):
if not self._content:
return True
else:
return False
def isFull(self):
if self._current == self._size:
return True
else:
return False
if __name__ == '__main___':
print('Please use me as a module.')
自定义二叉树
class BinaryTree:
def __init__(self, value):
self._left = None
self._right = None
self._data = value
def insert_left_child(self, value):
"""
创建左子树
:param value:
"""
if self._left:
print("left child tree has already exists.")
else:
self._left = BinaryTree(value)
return self._left
def insert_right_child(self, value):
"""
创建右子树
:param value:
"""
if self._right:
print("right child tree has already exists.")
else:
self._right = BinaryTree(value)
return self._right
def show(self):
print(self._data)
def pre_order(self):
"""
前序遍历
1.打印当前节点数据
2.打印左子树节点数据,遍历左子树
3.在叶子节点向根节点依次遍历右子树,打印节点数据
"""
print(self._data)
if self._left:
self._left.pre_order()
if self._right:
self._right.pre_order()
def post_order(self):
"""
后序遍历
先右再左即可,先遍历打印右节点,再打印当前节点
"""
if self._right:
self._right.post_order()
if self._left:
self._left.post_order()
print(self._data)
def in_order(self):
if self._left:
self._left.in_order()
print(self._data)
if self._right:
self._right.in_order()
if __name__ == '__main__':
print("provided by chan zany")