📅  最后修改于: 2023-12-03 14:54:56.574000             🧑  作者: Mango
给定一个二叉搜索树,实现一个函数,判断其是否为一个有效的二叉搜索树。
一棵二叉搜索树定义如下:
二叉搜索树中序遍历的结果是一个升序的数组,因此可以通过中序遍历二叉搜索树并保存前一个元素的值,然后比较当前遍历到的元素是否大于前一个元素。如果大于,继续遍历;如果小于或等于,返回 false。时间复杂度和空间复杂度都是 O(n)。
代码如下:
class Solution:
def isValidBST(self, root: TreeNode) -> bool:
stack, inorder = [], float('-inf')
while stack or root:
while root:
stack.append(root)
root = root.left
root = stack.pop()
# 如果当前值小于等于前一个 inorder,则不是 BST。
if root.val <= inorder:
return False
inorder = root.val
root = root.right
return True
可以按照 BST 的定义,递归判断左右子树是否是 BST,并且满足当前节点大于左子树的最大值,小于右子树的最小值。由于需要递归检查每一个节点,时间复杂度和空间复杂度都是 O(n)。
代码如下:
class Solution:
def isValidBST(self, root: TreeNode) -> bool:
def helper(node, lower=float('-inf'), upper=float('inf')):
if not node:
return True
if node.val <= lower or node.val >= upper:
return False
if not helper(node.right, node.val, upper):
return False
if not helper(node.left, lower, node.val):
return False
return True
return helper(root)
本文介绍了两种解决方法,一种是中序遍历,一种是递归。两种方法时间复杂度和空间复杂度都是 O(n),可以根据实际情况选择使用。