我们可以从给定的唯一非堆列表创建多个最小堆吗?
下面的L1
和L2
(共享完全相同的元素,但不是相同的顺序)是这个原始非堆列表的合法最小堆:[12,12,3,12,12,12,12,9,6,6,10,4,20]
L1=[3,4,9,6,10,12,12,12,6,12,12,12,20]
L2=[3,6,4,9,6,12,12,12,12,12,10,12,20]
这对我来说似乎很奇怪。这是常识吗?我很想得到一些确认。
附录:
此Python function检查列表是否验证了所有k的最小堆条件:heap[k] <= heap[2*k+1]
和heap[k] <= heap[2*k+2]
:
def is_min_heap(L):
return _is_min_heap(L, 0)
def _is_min_heap(L, i):
l, r = 2 * i + 1, 2 * i + 2
if r < len(L): # has left and right children
if L[l] < L[i] or L[r] < L[i]: # heap property is violated
return False
# check both children trees
return _is_min_heap(L, l) and _is_min_heap(L, r)
elif l < len(L): # only has left children
if L[l] < L[i]: # heap property is violated
return False
# check left children tree
return _is_min_heap(L, l)
else: # has no children
return True
答案 0 :(得分:1)
我可以向您指出max heap的相关问题吗?
我认为简而言之,该问题的第二个答案涵盖了所有:堆约束(即子项大于其父项)并不完全指定堆,因此通常不止一个可能的安排。对于最小堆,同样的约束适用,所以再次,可能有多个可能的安排,因此无法保证唯一性。