📜  在BST中查找第k个最小元素(BST中的订单统计信息)(1)

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

在BST中查找第k个最小元素(BST中的订单统计信息)

如果您需要寻找二叉搜索树(BST)中的第k个最小元素,您可以采用以下方法:

方法一:中序遍历

BST的中序遍历会按照升序顺序输出所有元素。因此,我们可以进行中序遍历,并在遍历过程中,记录已经访问的节点数目,直到达到第k个节点,此时即可返回该节点值。代码如下:

def kthSmallest(root, k):
    stack = []
    while True:
        while root:
            stack.append(root)
            root = root.left
        root = stack.pop()
        k -= 1
        if not k:
            return root.val
        root = root.right

时间复杂度:O(h+k),其中h是树的高度。因为栈的最大大小是h,而每个节点恰好被遍历一次,因此时间复杂度为O(h+k)。

方法二:深度优先搜索

我们也可以采用深度优先搜索的方式,从小到大访问每个节点,并返回第k个节点的值。代码如下:

def kthSmallest(root, k):
    def dfs(node):
        if not node:
            return None
        left = dfs(node.left)
        if left is not None:
            return left
        nonlocal k
        k -= 1
        if k == 0:
            return node.val
        right = dfs(node.right)
        return right
    return dfs(root)

时间复杂度:O(h+k),其中h是树的高度。即使在最坏情况下,我们也始终会先遍历根节点,然后遍历一条深度为h的子树,其大小最多为h+1,因此对于任何h和k,时间复杂度都是O(h+k)。

上述两种方法都是基于BST的性质进行的,因此停留在O(h+k)的时间复杂度下。