我正在尝试确定以节点为根的二叉树是否为最大堆,为此我遵循了堆属性的规则,指出了最大堆:
最大堆
所有节点都大于或等于其子节点
我对实施的看法:
我的代码:
class BTNode:
'''A generic binary tree node.'''
def __init__(self, v):
'''(BTNode, int) -> NoneType
Initialize a new BTNode with value v.
'''
self.value = v
self.left = None
self.right = None
def is_max_heap(node):
'''(BTNode) -> bool
Return True iff the binary tree rooted at node is a max-heap
Precondition: the tree is complete.
'''
if node.left and node.right is None:
return True
else:
if node.value > node.left.value and node.value > node.right.value:
return is_max_heap(node.left) and is_max_heap(node.right)
else:
return False
if __name__ == '__main__':
l1 = BTNode(7)
l2 = BTNode(6)
l3 = BTNode(8)
l1.left = l2
l1.right = l3
print(is_max_heap(l1))
因此,在if __name__ == '__main__':
下,我创建了三个节点,其值为7,6和8.第一个节点有一个左右节点。所以树看起来像这样:
7
/ \
6 8
这不满足max-heap属性所以它应该返回False。然而,运行我的代码返回True,我无法弄清楚我可能出错的地方。如果有人能帮助我,我将非常感激。
答案 0 :(得分:0)
当只有一个孩子时,你没有想到这种情况。确保你的程序在这两棵树上正常工作 - 一个是最小堆,另一个是最大堆:
2 1
/ /
1 2
还要学会正确设置括号;你犯了经典的错误True and 42 == 42
;这是True
。
考虑以同样的方式处理这两个可能不存在的孩子。
if left is not None:
if not <check max heap property for left subtree>: return False
if right is not None:
if not <check max heap property for right subtree>: return False
return True
缺少的函数应该与当前节点进行比较,并且在必要时递归到子树中。