Algorithm 如果二叉树包含重复项或包含+;/,如何检查二叉树是否为有效的BST无穷

Algorithm 如果二叉树包含重复项或包含+;/,如何检查二叉树是否为有效的BST无穷,algorithm,tree,Algorithm,Tree,我检查二叉树是否为BST的解决方案如下: def is_BST(node): if node is None: return False stack = [(node, -float('inf'), float('inf')] while len(stack) > 0: node, lb, ub = stack.pop() if node.val <= lb or node.val >= ub: return False

我检查二叉树是否为BST的解决方案如下:

def is_BST(node):
  if node is None:
    return False

  stack = [(node, -float('inf'), float('inf')]
  while len(stack) > 0:
    node, lb, ub = stack.pop()
    if node.val <= lb or node.val >= ub:
      return False

    if node.left:
       stack.append((node.left, lb, node.val))
    if node.right:
       stack.append((node.right, node.val, ub))

  return True
def是(节点):
如果节点为无:
返回错误
堆栈=[(节点,-float('inf'),float('inf')]
当len(stack)>0时:
节点,lb,ub=stack.pop()
如果node.val=ub:
返回错误
如果node.left:
stack.append((node.left,lb,node.val))
如果node.right:
stack.append((node.right、node.val、ub))
返回真值

但是,如果树包含-inf或inf,或者有重复的值,我的函数将无法正常工作。我如何调整它使其工作得更一般?

您可以实现一个更优雅的
递归
函数,还可以使用set:

set = {-float('inf'), float('inf')}
isValid = True


def BST(node):

if(node is None):
    return

if node.value in set:
    global isValid
    isValid = False
else:
    set.add(node.value)

    BST(node.left)
    BST(node.right)
您的代码似乎工作不正常:

node, lb, ub = stack.pop()

在这里,您要删除
节点
,您必须保留查找重复节点所需的所有数据。

您可以使用set:

set = {-float('inf'), float('inf')}
isValid = True


def BST(node):

if(node is None):
    return

if node.value in set:
    global isValid
    isValid = False
else:
    set.add(node.value)

    BST(node.left)
    BST(node.right)
您的代码似乎工作不正常:

node, lb, ub = stack.pop()
在这里,您要删除
节点
,您必须保留所有用于查找重复节点的数据