📅  最后修改于: 2023-12-03 15:37:34.329000             🧑  作者: Mango
如果您需要寻找二叉搜索树(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)的时间复杂度下。