当前位置: 首页 > 知识库问答 >
问题:

使用递归验证二叉搜索树

方韬
2023-03-14

我试图验证二叉查找树。给定二叉树的根,确定它是否是有效的二叉查找树(BST)。

有效的BST定义如下:

节点的左子树只包含键小于节点键的节点。节点的右子树只包含键大于节点键的节点。左子树和右子树也必须是二叉搜索树。

https://leetcode.com/problems/validate-binary-search-tree/

我正在使用递归解决方案,但它未能通过以下测试用例:
输入:[2,1,3]
预期输出:True
我的输出:False

示例输入:[5,1,4, null, null,3,6]
预期输出:False
我的输出:False

有人能指出我的错误吗?下面是我的代码

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def isValidBST(self, root: Optional[TreeNode]) -> bool:
        
        
        def valid(node, left, right):
            if not node:
                return True
            
            if not (node.val>left and node.val<right):
                return False
            
            return (valid(node.left, left, node.val) and valid(node.right, node.val, right))
                    
        return valid(root, float("-inf"), float("-inf"))

共有2个答案

宋烨烁
2023-03-14

可以通过在递归中为左侧和右侧节点提供一系列值来下推验证。这样,每个节点只需根据其父节点传递的需求检查自己,然后为自己的子节点递归。

def isBST(node,minVal=None,maxVal=None):
    if node is None: return True
    if minVal is not None and self.val<minVal: return False 
    if maxVal is not None and self.val>maxVal: return False
    if not isBST(self.left,minVal,self.val):   return False
    if not isBST(self.right,self.val,maxVal):  return False
    return True
穆季萌
2023-03-14

事实上,你离得不远。你只是错过了一个地方——看代码:

这里的想法是相同的,但代码略有不同,以匹配您的原始代码。逻辑并与你的帖子进行比较。

[注]灵感来源于Alain和OP递归思想。所以要归功于他们。;-)

 def isValidBST(self, root: TreeNode) -> bool:
     
     def validate(node, lower, upper):
         if not node:  return True    # empty node/Tree considered BST

         # compare the node range is still valid: between low and high
         if node.val > lower and node.val < upper:
            return validate(node.left, lower, node.val) and \
                   validate(node.right, node.val, upper)
            return False
     return validate(root, float("-inf"), float("+inf")) # <--- miss here!
     
 类似资料:
  • 上面的代码对所有测试用例都能很好地工作。但是,下面的代码不是。 额外的IF条件有什么需要?即使没有它们,函数也应该从下面的if条件返回false?我错过了什么?

  • 我试图为我的BST做一个递归加法。public add方法接受一个int参数,private方法接受相同的int和一个节点。这是我目前掌握的代码 我经常得到空指针,也尝试过调试,但我的逻辑中有一些我看不到的缺陷。

  • 我的解决方案在第二个例子中失败了,我不知道为什么,请解释。 问题是: 给定一棵二叉树,确定它是否是有效的二叉查找树(BST)。 假设BST的定义如下: 节点的左子树只包含键小于节点键的节点。节点的右子树仅包含键大于节点键的节点。左子树和右子树都必须是二进制搜索树。 例1: 输入:[2,1,3] 输出:真 例2: 输入:[5,1,4,空,空,3,6] 输出:false 说明:根节点的值为5,但其右子

  • 首先,这是家庭作业,所以把它放在外面。 我应该用特定的方法实现二叉查找树: void insert(字符串)、boolean remove(字符串)和boolean find(字符串)。 我已经能够成功地编程和测试插入,并找到方法,但我有困难与删除。 我的程序中发生的事情是,删除实际上并没有从树中删除任何东西,我相信这是因为它只引用当前节点的本地创建,但我可能错了。我认为我可以实现我需要测试的不同

  • 对于我用私有字段实现的二叉树对象 我有一个方法,它需要返回一个树,包括具有的节点和具有的节点之间的所有键及其相应值。这个方法也需要使用递归来执行。 我遇到的问题是,我无法找到一种方法来获得一个以结尾的树(可能看起来像一个LinkedList),而不包括和。我想我应该首先在根的左树或右树上递归调用方法,这取决于startKey是大于还是小于根键,所以: 这将一直在树中导航,直到到达包含键的节点。当我

  • 问题内容: 我想在非二叉树中搜索一个项目(任何节点都可以有n个孩子)并立即退出递归。所讨论的节点可以是任何节点,而不仅仅是叶子。 这是我的代码,但我没有完整的搜索。 nNode包含: (是孩子) 和数据对象。 问题答案: 探索第一个孩子后,您不应该退出。您不需要循环前面的语句。