查找BST中的所有节点是否都大于项目

时间:2018-08-15 14:14:09

标签: python

我一直在尝试实现下面的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

4 个答案:

答案 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
  • 节点中的值大于X,并且
  • 其左子树中的所有值(如果存在)都大于X

假设一棵空树是None

def all_bigger(self, value):
    return self.value > value and self.left and self.left.all_bigger(value)