我想编写一个函数,告诉我给定列表是否为最小堆。
到目前为止我所写的内容:
def is_min_heap(L):
return _is_min_heap(L, 0)
def _is_min_heap(L, i):
if
#base case
else:
return (L[i] < L[2*i+1] and _is_min_heap(L, 2*i+1)) and (L[i] < L[2*i+2] and _is_min_heap(L, 2*1+2))
我不确定基本情况应该是什么,我的递归调用是否正确?
另外,如何控制索引最终不会超出范围?
答案 0 :(得分:2)
对于给定的i
,您有三种不同的情况:要么您有两个孩子,在这种情况下,您需要检查两个孩子的堆属性,并递归检查两个子树;或者你只剩下一个孩子,在这种情况下你只需要检查一个;或者你没有孩子,即i
是一个叶子,它本身就是一个有效的堆。
您可以通过检查其索引是否仍在列表范围内来检查子项是否存在。
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