如何解决检查最小堆数组是否有效
我有这个函数 def validate(self) ,它应该检查给定的数组是否是有效的最小堆。我认为它有效,但因为我的数组在开始时有 None 像 [None,2,3,5] 它似乎遇到问题并给我错误 '<' not supported between instances of 'int' and 'nonetype'
如何跳过代码中的 none 值?
def validate(self):
"""
Validates the heap. Returns True if the heap is a valid min-heap,and
False otherwise.
"""
n = self.__len__()
for i in range(int((n - 2) / 2) + 2):
if self._items[2 * i + 1] < self._items[i]:
return False
if (2 * i + 2 < n and self._items[2 * i + 2] > self._items[i]):
return False
return True
新代码:
def validate(self):
"""
Validates the heap. Returns True if the heap is a valid min-heap,and
False otherwise.
"""
n = self.__len__()
for i in range(int((n - 2) / 2) + 2):
if self._items[i] != None:
if self._items[2 * i + 1] < self._items[i]:
return False
if (2 * i + 2 < n and self._items[2 * i + 2] > self._items[i]):
return False
错误:
File "<doctest __main__.MinHeap.validate[8]>",line 1,in <module>
h.validate()
File "x-wingide-python-shell://114699264/2",line 219,in validate
TypeError: '>' not supported between instances of 'int' and 'nonetype'
解决方法
改变
for i in range(int((n - 2) / 2) + 2):
if self._items[2 * i + 1] < self._items[i]
return False
if (2 * i + 2 < n and self._items[2 * i + 2] > self._items[i]):
return False
到
_items = list(filter(None,self._items)) # delete all Nones in the list,save the cleaned list into a local variable in case you want to use the unmodified list somewhere else
for i in range(int((n - 2) / 2) + 2):
if _items[2 * i + 1] < _items[i]:
return False
if (2 * i + 2 < n and _items[2 * i + 2] > _items[i]):
return False
这样,它会先从列表中删除所有的 None,然后才进行比较。
,与根据其左子节点和右子节点(如果有的话)检查每个非叶节点相比,根据其父节点检查每个非根节点更简单。
def validate(self):
n = len(self._items)
for i in range(2,n):
if self._items[i // 2] > self._items[i]:
return False
return True
您也可以使用带有 all
的推导式:
def validate(self):
n = len(self._items)
return all(self._items(i // 2) <= self._items[i] for i in range(2,n))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。