返回

轻松掌握LeetCode二叉搜索树:0098. 验证二叉搜索树

见解分享

二叉搜索树的Python实现和验证

探索二叉搜索树

在计算机科学领域,二叉搜索树 (BST) 是一种特殊类型的二叉树,以其数据组织方式而著称。BST 按照特定的规则组织其数据,使其能够快速高效地检索和搜索信息。

具体来说,BST 具有以下性质:

  • 每个节点都包含一个值。
  • 对于每个节点,其左子树中所有节点的值都小于该节点的值。
  • 对于每个节点,其右子树中所有节点的值都大于该节点的值。

用 Python 实现 BST

在 Python 中实现 BST 的一个常见方法是使用 TreeNode 类来表示每个节点。TreeNode 类包含三个属性:

  • val:存储节点的值。
  • left:指向左子树的指针。
  • right:指向右子树的指针。

使用这些属性,我们可以创建一棵二叉搜索树,如下所示:

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

root = TreeNode(10)
root.left = TreeNode(5)
root.right = TreeNode(15)
root.left.left = TreeNode(2)
root.left.right = TreeNode(7)
root.right.left = TreeNode(12)
root.right.right = TreeNode(20)

验证 BST

验证一棵二叉树是否是有效的 BST 是一个常见的问题。要验证 BST,我们需要检查两个条件:

  • 每个节点的值都大于其左子树中的所有节点的值。
  • 每个节点的值都小于其右子树中的所有节点的值。

我们可以使用递归来编写一个 Python 函数来验证 BST。该函数将遍历二叉树,并检查每个节点是否满足上述条件。

def is_valid_bst(root):
    def helper(node, lower, upper):
        if not node:
            return True

        if node.val <= lower or node.val >= upper:
            return False

        return helper(node.left, lower, node.val) and helper(node.right, node.val, upper)

    return helper(root, float('-inf'), float('inf'))

优化验证

尽管递归方法可以有效地验证 BST,但它可能导致空间复杂度较高。为了优化验证,我们可以使用中序遍历。中序遍历将二叉树中的节点按升序排列。如果二叉树是有效的 BST,则中序遍历的结果应该是一组升序排列的值。

def is_valid_bst_inorder(root):
    prev = None

    def inorder(node):
        nonlocal prev

        if not node:
            return True

        if not inorder(node.left):
            return False

        if prev and prev.val >= node.val:
            return False

        prev = node

        return inorder(node.right)

    return inorder(root)

常见问题解答

1. 如何判断一个二叉树是否是完整的 BST?

一棵完整的 BST 是一个所有节点都有左子树和右子树的二叉树。我们可以使用深度优先搜索或广度优先搜索来判断一棵二叉树是否是完整的 BST。

2. 如何删除 BST 中的一个节点?

删除 BST 中的一个节点需要考虑三种情况:

  • 该节点是叶子节点。
  • 该节点有一个子树。
  • 该节点有两个子树。

3. 如何在 BST 中查找一个值?

在 BST 中查找一个值可以使用递归或迭代。递归方法从根节点开始,根据要查找的值与当前节点的值进行比较,然后在适当的子树中继续查找。

4. 如何在 BST 中插入一个值?

在 BST 中插入一个值需要遍历二叉树,找到要插入的位置。插入位置是具有比要插入的值小或大的值的叶子节点。

5. 如何遍历 BST?

遍历 BST 的三种常见方法是:

  • 前序遍历:访问根节点,然后前序遍历左子树和右子树。
  • 中序遍历:中序遍历左子树,然后访问根节点,最后中序遍历右子树。
  • 后序遍历:后序遍历左子树,然后后序遍历右子树,最后访问根节点。