所谓对象的可叠代输出,就是想用for c in xx:print(c)做到输出内部元素。
这几天学习的是二叉堆,书上没有提供二叉堆形成后的元素输出功能。
全部的代码如下,但__iter__和__next__是后加的,目标就是最后的输出实现。
我还是想实现直接print(obj),但是方法没找到。后续。
__author__ = 'zcl'
'''
最小二叉堆
定义:节点key总是小于它的孩子。
特点:父亲在i//2,孩子在2*i
'''
class BinHeap:
def __init__(self):
self.heapList = [0]
self.currentSize = 0
self.current = 0
def len(self):
return len(self.heapList) - 1
def __repr__(self):
for c in self:
print(c, end=' ')
def __iter__(self):
return self
def __next__(self):
#k = 1
if self.current == self.currentSize:
raise StopIteration
else:
self.current += 1
return self.heapList[self.current]
def percUp(self, i):
# 对指定位置的元素,调整位置到合适的地方(上升)
while i // 2 > 0:
# i//2第一次执行是新插入节点的父亲。
if self.heapList[i] < self.heapList[i // 2]:
self.heapList[i], self.heapList[i // 2] = self.heapList[i // 2], self.heapList[i]
i //= 2
#
def insert(self, k):
# 插入新元素的操作
self.heapList.append(k)
# 追加到最后
self.currentSize += 1
# 计算当前大小
self.percUp(self.currentSize)
# 将新元素调整到合适的位置
def percDown(self, i):
# 下行调整
while (i * 2) <= self.currentSize:
# 计算是否到底了。如果不到底……
mc = self.minChild(i)
# 计算自己的最小孩子,见下minChild()
if self.heapList[i] > self.heapList[mc]:
# 如果自己的值大于较小的孩子,交换值。
tmp = self.heapList[i]
self.heapList[i] = self.heapList[mc]
self.heapList[mc] = tmp
i = mc
# 沿较小的子树继续下行
def minChild(self, i):
if i * 2 + 1 > self.currentSize:
# 如果右孩子超过堆大小,结合上面,可知左孩子肯定存在,而右孩子不存在。
return i * 2
# 返回左孩子的索引
else:
# 否则左右孩子都存在,返回较小的一个。
if self.heapList[i * 2] < self.heapList[i * 2 + 1]:
return i * 2
else:
return i * 2 + 1
def delMin(self):
# 删除最小元素
retval = self.heapList[1]
# 建立内部变量,指向第一个元素
self.heapList[1] = self.heapList[self.currentSize]
# 把最后一个节点放在根上
self.currentSize -= 1
# 大小值变化
self.heapList.pop()
# 删除末位元素
self.percDown(1)
# 末位元素调整位置
return retval
def buildHeap(self, alist):
# 根据一个现有的表建立堆
i = len(alist) // 2
# 长度/2即第一个有孩子的节点,最后一片叶子的父亲。
self.currentSize = len(alist)
self.heapList = [0] + alist[:]
# 建立完全二叉树
while i > 0:
# 把完全二叉树调整为最小堆
self.percDown(i)
i = i - 1
alist = [7, 9, 12, 8, 3, 16, 4, 11, 1, 34, 2]
bh = BinHeap()
bh.buildHeap(alist)
for c in bh:
print(c, end=' ')
#print(bh.heapList[1:] )
# for
in bh: print(i)
# 出错了
# print(bh.delMin())
# print(bh.delMin())
# print(bh.delMin())
# print(bh.delMin())
# print(bh.delMin())