对象如何可叠代输出

所谓对象的可叠代输出,就是想用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())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值