这个BST验证函数正确吗?

问题描述 投票:0回答:1

我写了一些验证 BST 的逻辑,这似乎有效:

class Node:
  val: int
  left: 'Node | None' = None
  right: 'Node | None' = None

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

# -----------------------

def isValidBST(root: Node, mn=float('-Inf'), mx=float('+Inf')) -> bool:
  if not (mn < root.val < mx):
    return False
  if root.left and not isValidBST(root.left, mn=mn, mx=root.val):
    return False
  if root.right and not isValidBST(root.right, mn=root.val, mx=mx):
    return False
  return True

我尝试根据此树定义对其进行测试:

#          5
#     2         9
#   0   4     7   10 
#           6

tree = Node(5,
            Node(2,
                 Node(0),
                 Node(4)),
            Node(9,
                 Node(7,
                      Node(6)),
                 Node(10)))

函数返回

True
。如果我使树无效(例如将 4 切换到 5 或 7 切换到 3),它会返回
False
。它似乎也在正确的时间停止,我检查了一些日志。

这个功能有效吗?不管怎样,它能以某种方式变得更好吗?

algorithm binary-search-tree
1个回答
0
投票

是的,它是正确且清晰的。您只能做一个非常小的改进,您可以使用 -inf 和 inf 代替 -Inf 和 +Inf,如下所示:

class Node:
  val: int
  left: 'Node | None' = None
  right: 'Node | None' = None

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

# -----------------------

def isValidBST(root: Node, mn=float('-inf'), mx=float('inf')) -> bool:
  if not (mn < root.val < mx):
    return False
  if root.left and not isValidBST(root.left, mn=mn, mx=root.val):
    return False
  if root.right and not isValidBST(root.right, mn=root.val, mx=mx):
    return False
  return True
© www.soinside.com 2019 - 2024. All rights reserved.