17_数据结构与算法_二叉堆_Python实现

#Created By: Chen Da

#先实现一个二叉堆,基于完整二叉树
class Binary_heap(object):
    def __init__(self):
        self.heap_list = [0]            #一个空的二叉堆以零作为第一个元素,方便后续的整除计算
        self.curr_size = 0

    #通过比较新添加的项与父项的大小,如果该项小于父项则交换,从而维持堆的结构属性
    def swap_up(self,i):
        while i // 2 > 0:
            if self.heap_list[i] < self.heap_list[i // 2]:
                tmp = self.heap_list[i]
                self.heap_list[i] = self.heap_list[i//2]
                self.heap_list[i//2] = tmp
            i //= 2

    def insert(self,i):
        self.heap_list.append(i)
        self.curr_size += 1
        self.swap_up(self.curr_size)

    #寻找当前节点的最小子节点
    def find_min_child(self,i):
        if i * 2 + 1 > self.curr_size:
            return i * 2
        else:
            if self.heap_list[i * 2] < self.heap_list[i * 2 + 1]:
                return i * 2
            return i * 2 + 1

    #交换节点与其子节点直到都满足正确的位置
    def swap_down(self,i):
        while (i * 2) <= self.curr_size:
            min_child = self.find_min_child(i)
            if self.heap_list[i] > self.heap_list[min_child]:
                tmp = self.heap_list[i]
                self.heap_list[i] = self.heap_list[min_child]
                self.heap_list[min_child] = tmp
            i  = min_child

    def del_min(self):
        min_value = self.heap_list[1]
        #将最后一项交换到首项
        self.heap_list[1] = self.heap_list[self.curr_size]
        self.curr_size -= 1
        self.heap_list.pop()
        #维持堆正确的结构属性
        self.swap_down(1)
        return min_value

    #利用列表构建堆的方法
    def build_heap(self,lyst):
        i = len(lyst) // 2      #从树的中间开始
        self.curr_size = len(lyst)
        self.heap_list = [0] + lyst[:]
        while i > 0:
            self.swap_down(i)
            i -= 1

    def get_list(self):
        return self.heap_list

def test_binary_heap():
    bh = Binary_heap()
    bh.build_heap([3,5,7,1,2,9,4,11,17])
    print(bh.get_list())
    assert bh.del_min() == 1
    print(bh.get_list())
    bh.insert(15)
    print(bh.get_list())



if __name__ == "__main__":
    test_binary_heap()

猜你喜欢

转载自blog.csdn.net/PyDarren/article/details/83859824