返回

二叉搜索树的奥秘:揭开 LeetCode 98 号问题的密码

前端

踏入计算机编程的奇妙世界,我们不可避免地会遇到二叉搜索树,一种以其高效查找和排序能力而闻名的数据结构。当探索 LeetCode 的浩瀚世界时,第 98 号问题向我们提出了一个引人入胜的挑战:验证一棵二叉树是否是一棵有效的二叉搜索树。

在这个问题中,我们有一个二叉树的根节点,我们必须确定它是否满足二叉搜索树的严格定义。那么,什么是二叉搜索树?

想象一棵由节点组成的树,每个节点都包含一个值。在这棵树中,每个节点的值都比其左子树中的所有节点的值大,而比其右子树中的所有节点的值小。这种有序的结构使得在二叉搜索树中查找和排序元素变得轻而易举。

揭开验证之谜

要验证一棵二叉树是否是一棵有效的二叉搜索树,我们可以采取两种主要方法:中序遍历和递归。

方法 1:中序遍历

中序遍历是一种深度优先遍历,它按照左、根、右的顺序访问每个节点。对于二叉搜索树,中序遍历会产生一个递增的数组,因为左子树的值小于根的值,而右子树的值大于根的值。

如果遍历中得到的数组不是递增的,那么这棵树就不是有效的二叉搜索树。

方法 2:递归

递归是一种通过分而治之解决问题的技术。对于二叉搜索树的验证,我们可以递归地验证每个子树。

如果一个子树满足以下条件,那么它就是有效的:

  • 左子树中的所有节点值都小于根节点值。
  • 右子树中的所有节点值都大于根节点值。
  • 左子树和右子树都是有效的二叉搜索树。

如果这些条件都满足,那么整个二叉树就是有效的二叉搜索树。

LeetCode 98 号问题:代码实现

def isValidBST(root):
    # 设置一个合理的最大值和最小值
    min_val = float('-inf')
    max_val = float('inf')
    
    return helper(root, min_val, max_val)
    
# 递归函数,验证二叉树的每个子树
def helper(root, min_val, max_val):
    if not root:
        return True
    
    # 检查当前节点是否在给定的范围内
    if root.val <= min_val or root.val >= max_val:
        return False
    
    # 递归验证左子树和右子树
    left_valid = helper(root.left, min_val, root.val)
    right_valid = helper(root.right, root.val, max_val)
    
    return left_valid and right_valid

总结

二叉搜索树是一种基本的数据结构,在计算机科学中有着广泛的应用。LeetCode 98 号问题测试了我们对二叉搜索树基本概念和验证技术的理解。通过探索不同的方法,我们可以深入了解二叉搜索树的工作原理,并提高我们解决算法问题的技能。