繁体   English   中英

使用递归验证二叉搜索树

[英]Validate a binary search tree using recursion

我正在尝试验证二叉搜索树。 给定二叉树的根,确定它是否是有效的二叉搜索树 (BST)。

一个有效的 BST 定义如下:

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

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

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

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

有人可以识别我的错误吗? 下面是我的代码:

# 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"))

其实,你离得并不远。 你只是错过了一个地方 - 看代码:

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

[注] 受 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!
     

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM