📜  BST中给定密钥的有序前任和后继(1)

📅  最后修改于: 2023-12-03 15:13:43.567000             🧑  作者: Mango

BST中给定密钥的有序前任和后继

BST(二叉搜索树)是一种数据结构,其中每个节点都包含一个键值,左子树的所有键值小于该节点的键值,而右子树的所有键值都大于该节点的键值。在这种结构中,查询具有某些属性的密钥变得相对容易,其中包括有序前任和后继

前提条件

我们假设你已经熟悉二叉树和BST的基础知识。如果你对此不熟悉,可以参考以下链接:

  1. BinarySearchTree - Wikipedia
  2. Introduction to Binary Trees - GeeksforGeeks
有序前任

给定BST中的一个键,“有序前任”是指小于该键且不大于任何其他键的键值中的最大键值。

以下是定义有序前任数值的递归函数,它返回BST中给定键的最大值。

def inorder_predecessor(root, key):
    if not root:
        return None

    if root.key >= key:
        return inorder_predecessor(root.left, key)
        
    right_val = inorder_predecessor(root.right, key)
    return right_val if right_val else root.key

这个递归函数采用以下方法:

  1. 如果根节点的键值大于或等于给定键,则有序前任位于左子树中。因此,我们递归地调用函数,直到我们找到一个小于给定键值的键,然后返回该键。
  2. 如果根节点的键值小于给定键,则有序前任位于右子树中。如果右子树中有值,则返回右子树的值,否则返回该节点的键值,因为此节点是给定节点和右子树中所有节点的关键字上的前任。
有序后继

给定BST中的一个键,“有序后继”是指大于该键且不小于任何其他键的键值中的最小键值。

以下是定义有序后继数值的递归函数,它返回BST中给定键的最小值。

def inorder_successor(root, key):
    if not root:
        return None
        
    if root.key <= key:
        return inorder_successor(root.right, key)
        
    left_val = inorder_successor(root.left, key)
    return left_val if left_val else root.key

这个递归函数采用以下方法:

  1. 如果根节点的键值小于或等于给定键,则有序后继位于右子树中。因此,我们递归地调用函数,直到我们找到一个大于给定键值的键,然后返回该键。
  2. 如果根节点的键值大于给定键,则有序后继位于左子树中。如果左子树中有值,则返回左子树的值,否则返回该节点的键值,因为此节点是给定节点和左子树中所有节点的关键字上的后继。
总结

有序前任和有序后继在许多情况下都会得到很好的利用。比如在一个BST中查找一个数时,可以用前驱和后继来判断目标数是否在BST中,并且还可以用它们来找到重复键。

上述实现方式是递归的,如果你对递归的工作原理感到困惑,我们可以使用迭代方式来实现这两个函数。

以上是有序前任和后继的相关介绍,希望对你有所帮助。