📌  相关文章
📜  BST中最小的数字,它大于或等于N(1)

📅  最后修改于: 2023-12-03 14:39:36.041000             🧑  作者: Mango

寻找BST中大于或等于N的最小数字

本文介绍如何在二叉搜索树(BST)中寻找大于或等于给定数值N的最小数字。我们将要介绍两种实现方式,一种基于递归算法,一种基于迭代算法。

算法介绍
递归算法

我们可以利用二叉搜索树的性质,在每个递归函数中比较当前节点的值与N的关系,并根据情况向左或向右递归。具体流程如下:

  1. 如果当前节点的值等于N,那么N就是BST中大于或等于N的最小数字,直接返回当前节点的值;
  2. 如果当前节点的值小于N,那么在当前节点的右子树中查找;
  3. 如果当前节点的值大于N,那么在当前节点的左子树中查找;
  4. 如果当前节点为空,那么说明BST中不存在大于或等于N的数字,返回None。
迭代算法

对于迭代算法,我们可以利用BST的中序遍历结果是一个递增的有序数组的特性。如果当前节点的值小于N,那么N的最小值肯定在当前节点的右子树中;如果当前节点的值大于等于N,那么N的最小值肯定在当前节点的左子树中。具体实现如下:

  1. 初始化一个当前节点为BST的根节点,将其压入栈中;
  2. 当栈不为空时,将当前节点出栈,并比较其值与N的关系;
  3. 如果当前节点的值等于N,那么N就是BST中大于或等于N的最小数字,直接返回当前节点的值;
  4. 如果当前节点的值小于N,那么将其右子树的根节点压入栈中;
  5. 如果当前节点的值大于等于N,那么将其左子树的根节点压入栈中;
  6. 如果以上步骤执行完毕,仍然没有找到符合条件的数字,说明BST中不存在大于或等于N的数字,返回None。
代码实现
递归算法
def find_minimum_greater_or_equal(root, n):
    if not root:
        return None
    if root.val == n:
        return root.val
    if root.val < n:
        return find_minimum_greater_or_equal(root.right, n)
    left = find_minimum_greater_or_equal(root.left, n)
    if left is None:
        return root.val
    return left
迭代算法
def find_minimum_greater_or_equal(root, n):
    stack = [root]
    while stack:
        curr = stack.pop()
        if curr.val >= n:
            if curr.left:
                stack.append(curr.left)
            else:
                return curr.val
        elif curr.right:
            stack.append(curr.right)
    return None
性能分析
时间复杂度

对于递归算法,最坏的时间复杂度为O(n),其中n是BST中的节点数,当BST的每个节点都小于N时,必须遍历完整棵树。

对于迭代算法,时间复杂度为O(h),其中h是BST的高度。因为算法每次搜索时只需要往BST的高度方向搜索,所以时间复杂度和BST的高度挂钩,可以保证不超过O(logn)的时间复杂度。

空间复杂度

对于递归算法,最坏的空间复杂度为O(n),因为算法可能会在BST的每个节点都递归到,并且函数调用栈的深度最大为n。

对于迭代算法,空间复杂度取决于栈的大小,最坏的情况下,当BST每个节点都在搜索路径上时,栈的大小为O(h),同样也可以保证不超过O(logn)的空间复杂度。

总结

本文介绍了在BST中寻找大于或等于给定数值N的最小数字的两种实现方式,分别是递归算法和迭代算法。两种算法的时间复杂度都可以保证在O(logn)以内,空间复杂度最坏情况下都为O(n)。编写代码时要注意处理边界条件和空节点的情况。