返回

在二叉搜索树中找出第 k 个最小元素:详解 LeetCode 230

见解分享

在计算机科学中,二叉搜索树(BST)是一种有效的数据结构,可以高效地存储和检索数据。由于其独特的数据组织方式,BST 具有许多有用的特性,使其适用于各种应用。其中一个重要的特性是能够快速找到特定元素,包括找到第 k 个最小元素。

理解题目:LeetCode 230

LeetCode 230:“二叉搜索树中第 k 个最小元素”题目要求我们给定一个二叉搜索树和一个正整数 k,找出并返回二叉搜索树中第 k 个最小的元素。需要特别注意的是,这里的 k 是从 1 开始计数的,这意味着 k = 1 表示最小的元素。

算法详解

解决此问题的关键在于理解 BST 的性质。在 BST 中,左子树中的所有元素都小于其父节点,而右子树中的所有元素都大于其父节点。利用这一性质,我们可以使用中序遍历的变体来找到第 k 个最小元素。

中序遍历以升序访问 BST 中的所有元素。我们可以通过修改中序遍历算法,在访问第 k 个元素时返回该元素。以下是如何实现此算法的步骤:

  1. 初始化一个计数器 k ,从 1 开始。
  2. 使用中序遍历遍历 BST
  3. 对于遍历的每个节点:
    • 递增计数器 k
    • 如果 k 等于给定的 k ,则返回当前节点的值。
  4. 如果遍历完成,并且没有找到第 k 个最小元素 ,则返回 -1(表示没有找到)。

代码示例

def kth_smallest(root, k):
  """
  返回二叉搜索树中第 k 个最小的元素。

  :param root: 二叉搜索树的根节点。
  :param k: 要查找的元素的排名。
  :return: 第 k 个最小的元素,如果不存在,则返回 -1。
  """

  def inorder(node):
    if not node:
      return

    inorder(node.left)
    self.count += 1
    if self.count == k:
      self.result = node.val
      return
    inorder(node.right)

  self.count = 0
  self.result = None
  inorder(root)
  return self.result

复杂度分析

  • 时间复杂度:O(n),其中 n 是二叉搜索树中的节点数。中序遍历需要访问每个节点一次。
  • 空间复杂度:O(1),因为算法使用常量空间。

结论

使用中序遍历的变体,我们可以高效地找到二叉搜索树中第 k 个最小的元素。算法的时间复杂度为 O(n),空间复杂度为 O(1)。通过理解 BST 的性质和利用中序遍历,我们可以解决各种基于 BST 的问题,包括找到第 k 个最小元素。