确定树是否是有效BST的功能?

时间:2017-01-05 17:35:56

标签: python recursion binary-search-tree

我必须确定是否给出了表示树的列表,树是否是有效的BST(此问题来自leetcode)。我已经看到了其他帖子,但我想知道是否有人可以帮助我的方法,因为它显然是不对的。例如,对于树[1,2,3],其中1是根,2是左子,3是右子,我的代码返回true。希望它只需要很小的改动,但可能是整个函数的方法都不正确。

这是我的代码:

def isValidBST(self, root):
    if (root == None):
        return True
    if (root.left == None or root.left.val < root.val):
        return self.isValidBST(root.left)
    if (root.right == None or root.right.val > root.val):
        return self.isValidBST(root.right)
    return False

其次,我已经看到了带有辅助函数的方法,它接受最小/最大值,但这让我感到困惑。如果有人也想解释为什么这种方法是好的/更好的,那将非常感激!

2 个答案:

答案 0 :(得分:3)

我为min_max制作Node方法,找到以Node为根的树的最小值和最大值。在找到它们时进行健全性检查,然后isValidBST可以捕获异常

def max_min(self): 

    '''
    Returns maximum and minimum values of the keys of the tree rooted at self. 
    Throws an exception if the results are not correct for a BST
    '''

    l_max, l_min = self.left.max_min() if self.left else (self.val, self.val)
    if l_max > self.val:
        raise ValueError('Not a BST')
    r_max, r_min = self.right.max_min() if self.right else (self.val, self.val)
    if r_min < self.val:
        raise ValueError('Not a BST')
    return l_min, r_max

def isValidBST(self):
    try:
        if self.max_min():
            return True
    except ValueError:
            return False

答案 1 :(得分:0)

以下是实施有效性检查的一种方法:

class BST:

    def __init__(self, value, left=None, right=None):
        self.value = value
        self.left = left
        self.right = right

    def isValidBST(self):
        '''
        Simultaneously check for validity and set our own min and max values.
        '''
        self.min = self.max = self.value
        if self.left:
            if not self.left.isValidBST():
                return False
            if self.left.max >= self.value:
                return False
            self.min = self.left.min
        if self.right:
            if not self.right.isValidBST():
                return False
            if self.right.min < self.value:
                return False
            self.max = self.right.max
        return True

assert BST(2, BST(1), BST(3)).isValidBST()
case = BST(2, BST(1, None, BST(3)))
assert case.left.isValidBST()
assert not case.isValidBST()