定义
废话不多说,直接上干货。
完全二叉树是一种特殊的二叉树,具有一些特定的性质。以下是完全二叉树的定义:
-
二叉树结构: 完全二叉树是一棵二叉树,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。
-
层次结构: 除了最后一层,其他所有层的节点都必须是满的,即每一层从左到右都有节点。如果最后一层不是满的,那么节点都尽量靠左排列。
-
填充规则: 如果有若干节点在最后一层,它们只能出现在最左边的连续位置,不能留有空隙。即从左到右填充节点,不允许在最后一层中出现中间有空缺的情况。
这些性质保证了完全二叉树在数组中的存储方式是高效的,因为它可以通过数组索引直接定位到某个节点。例如,对于任意节点的索引 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