我一直在尝试实现下面的all_bigger函数,但是我不确定我的逻辑是否存在缺陷。据我了解,BST的组织在左侧具有最小值,因此我只需要检查BST的左侧即可。有没有更好的方式编写此代码,或者我的代码不正确?
class BSTNode:
"""A node is a BST """
def __init__(self: 'BSTNode', item, left, right):
self.item, self.left, self.right = item, left, right
def all_bigger(self, value):
"""
>>> bst = BSTNode(5, BSTNode(4), BSTNode(6))
>>> all_bigger(bst, 2)
True
"""
while self.left:
if self.left > value:
self.value = self.left:
else:
return False
return True
答案 0 :(得分:2)
IIUC您的问题是查看BST中的所有节点是否都大于某个值。
一种简单的方法是在BST中找到具有最小值的节点,并将其与其他值进行比较。最小的节点将是最左侧的节点。
一个典型的BST节点看起来像这样
# A binary tree node
class Node:
# Constructor to create a new node
def __init__(self, key):
self.data = key
self.left = None
self.right = None
是的,你是对的。不需要完全搜索树,即可以跳过正确的子树。这样便可以找到具有最小值的节点。
def minValue(node):
current = node
# loop down to find the lefmost leaf
while(current.left is not None):
current = current.left
return current.data
可以稍作调整以解决您的问题
def all_bigger(node, val):
current = node
# loop down to find the lefmost leaf
while(current.left is not None):
current = current.left
# Check if the current node value is smaller than val
if current.data < val:
return False
return True
答案 1 :(得分:2)
您的代码几乎是正确的,但有一些小错误。更正的代码:
class BSTNode:
"""A node is a BST """
def __init__(self, item, left = None, right = None):
self.item, self.left, self.right = item, left, right
def all_bigger(self, value):
"""
>>> bst = BSTNode(5, BSTNode(4), BSTNode(6))
>>> all_bigger(bst, 2)
True
"""
root = self
while(root!=None):
if root.item > value:
root = root.left
else:
return False
return True
bst = BSTNode(5, BSTNode(4,BSTNode(1, None, None),None), BSTNode(6,None,None)) # Returns False
print(bst.all_bigger(2))
答案 2 :(得分:0)
您需要在每次比较后更新节点。请检查以下代码:
class BSTNode:
"""A node is a BST """
def __init__(self: 'BSTNode', item, left, right):
self.item, self.left, self.right = item, left, right
def all_bigger(self, value):
"""
>>> bst = BSTNode(5, BSTNode(4), BSTNode(6))
>>> all_bigger(bst, 2)
True
"""
while self.item:
if self.left > value:
self.item = self.left:
else:
return False
return True
答案 3 :(得分:0)
当且仅当
时,子树中的所有值都大于X假设一棵空树是None
:
def all_bigger(self, value):
return self.value > value and self.left and self.left.all_bigger(value)