优先级队列完全二叉树实现

本文详细介绍了完全二叉树的概念及其在数组中的高效存储方式,特别是通过Python实现的优先级队列,展示了如何利用数组进行入队和出队操作,确保队列内优先级最高的元素始终位于顶部。
摘要由CSDN通过智能技术生成

定义

        废话不多说,直接上干货。

        完全二叉树是一种特殊的二叉树,具有一些特定的性质。以下是完全二叉树的定义:

  1. 二叉树结构: 完全二叉树是一棵二叉树,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。

  2. 层次结构: 除了最后一层,其他所有层的节点都必须是满的,即每一层从左到右都有节点。如果最后一层不是满的,那么节点都尽量靠左排列。

  3. 填充规则: 如果有若干节点在最后一层,它们只能出现在最左边的连续位置,不能留有空隙。即从左到右填充节点,不允许在最后一层中出现中间有空缺的情况。

这些性质保证了完全二叉树在数组中的存储方式是高效的,因为它可以通过数组索引直接定位到某个节点。例如,对于任意节点的索引 i

  • 如果 i = 0,它是树的根。
  • 如果 i 是奇数,其父节点是 (i-1)/2
  • 如果 i 是偶数,其父节点是 i/2 - 1

对于每个节点 i,其左子节点的索引是 2*i + 1,右子节点的索引是 2*i + 2

 数组实现二叉树

        数组表示完全二叉树,即元素永远都是从最左边开始填写,可以使用数组来表示即:1-2-3-4-5-6-7-8-9 1的子节点为2,3。  2的子节点为4,5。

        重点!
        计算公式:父节点地址=floor((子节点位置-1)/2),floor为向下取整。子节点 left=i*2+1   right=i*2+2
        入队时先取最后一位再循环与父节点优先级对比,根据优先级决定是否调换位置,循环到没必要调换位置时即插入成功。
        出队时先将根节点与最后的节点调换位置,再从根节点循环往下调换位置,直至该节点跳到最低点。

        核心思想就是在入队和出队时将对内优先级最高的节点置于最顶点。

图示:

图中可以更直观看到数组与数节点的对应关系

代码实现(python)

class PriotityQueue:
    def __init__(self, capacity):
        self.arrray = numpy.empty(capacity)
        self.capacity = capacity
        self.size = 0
    #入队方法
    def offer(self, value):
        if self.isFull():
            return
        self.arrray[self.size] = value
        current = self.size  # 操作的坐标
        self.size += 1
        while True:
            if self.size == 1: #当只有一个节点时不需要置换位置
                return
            parent = math.floor((current-1) / 2)  # 父节点坐标
            if parent < 0:
                return
            if self.arrray[parent] < self.arrray[current]:
                temp = self.arrray[current]
                self.arrray[current] = self.arrray[parent]
                self.arrray[parent] = temp
                current = parent
            else:
                break
    #出队方法
    def poll(self):
        if self.isEmpty():
            return
        temp = self.arrray[0]
        self.arrray[0] = self.arrray[self.size-1]
        self.arrray[self.size-1] = temp

        result = self.arrray[self.size-1]
        self.arrray[self.size-1] = None
        self.size -= 1
        #开始排序操作
        current = 0
        while True:
            left = (current*2) + 1
            right = (current*2) + 2
            if left >= self.size-1:
                break
            if self.arrray[left] > self.arrray[right]:
                temps = self.arrray[current]
                self.arrray[current] = self.arrray[left]
                self.arrray[left] = temps
                current = left
            else:
                temp = self.arrray[current]
                self.arrray[current] = self.arrray[right]
                self.arrray[right] = temp
                current = right
        return result

    def peek(self):
        if self.isEmpty():
            return None
        result = self.arrray[0]
        return  result
    def isEmpty(self):
        if self.size == 0:
            return True
        else:
            return False
    def isFull(self):
        if self.size == self.capacity:
            return True
        else:
            return False

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

邻家小妹妹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值