返回

路飞:二叉搜索树合法性判断

前端

二叉搜索树是一种广泛应用于计算机科学中的数据结构,具有高效查找、插入和删除等优点。然而,若一棵二叉树不满足二叉搜索树的性质,则无法高效地执行上述操作。因此,对二叉搜索树的合法性进行判断就显得十分必要。

让我们首先回顾一下二叉搜索树的特点:

  • 每个节点的左子树的所有节点值都小于该节点的值。
  • 每个节点的右子树的所有节点值都大于该节点的值。
  • 左右子树也都是二叉搜索树。

根据这些特点,我们可以使用递归或迭代的方法来判断一棵二叉树是否合法。

递归法

递归法是一种从顶向下分解问题的思想。我们可以从二叉树的根节点开始,然后递归地判断其左右子树是否合法。如果左右子树都合法,并且满足二叉搜索树的性质,那么整棵树就是合法的。

def is_bst(root):
    """
    判断一棵二叉树是否为合法的二叉搜索树。

    Args:
        root: 二叉树的根节点。

    Returns:
        如果二叉树合法,返回True;否则,返回False。
    """

    # 如果树为空,则直接返回True。
    if root is None:
        return True

    # 判断左右子树是否合法。
    left_is_bst = is_bst(root.left)
    right_is_bst = is_bst(root.right)

    # 判断左右子树是否满足二叉搜索树的性质。
    if left_is_bst and right_is_bst:
        if root.left is None or root.left.val < root.val:
            if root.right is None or root.right.val > root.val:
                return True

    # 如果左右子树不合法,或者不满足二叉搜索树的性质,则返回False。
    return False

迭代法

迭代法是一种从底向上解决问题的思想。我们可以从二叉树的叶子节点开始,然后依次往上判断其父节点是否合法。如果所有节点都合法,并且满足二叉搜索树的性质,那么整棵树就是合法的。

def is_bst(root):
    """
    判断一棵二叉树是否为合法的二叉搜索树。

    Args:
        root: 二叉树的根节点。

    Returns:
        如果二叉树合法,返回True;否则,返回False。
    """

    # 使用栈来存储待处理的节点。
    stack = []

    # 使用一个变量来存储上一个访问过的节点。
    prev = None

    # 从根节点开始遍历二叉树。
    while root or stack:
        # 如果当前节点不为空,则将其压入栈中,并继续遍历其左子树。
        while root:
            stack.append(root)
            root = root.left

        # 如果当前节点为空,则说明已经遍历到了叶子节点。
        # 弹出栈顶节点,并判断其是否合法。
        root = stack.pop()
        if prev is not None and root.val <= prev.val:
            return False
        prev = root

        # 继续遍历右子树。
        root = root.right

    # 如果遍历完所有节点,则说明二叉树合法。
    return True

二叉搜索树是一种十分重要的数据结构,具有高效查找、插入和删除等优点。因此,对二叉搜索树的合法性进行判断就显得十分必要。本文介绍了两种判断二叉搜索树合法性的方法:递归法和迭代法。希望读者能够熟练掌握这两种方法,以便在实际工作中灵活应用。