返回

Python LeetCode 230:二叉搜索树中第 K 小的元素

后端

问题

给定一个二叉搜索树(BST)的根节点 root 和一个整数 k,返回该二叉搜索树中第 k 小的元素。

解法一:递归

我们采用递归的方式来解决这个问题。我们首先在左子树中查找第 k 小的元素,如果找到则直接返回。否则,我们在右子树中查找第 k - (左子树节点数)小的元素,找到则直接返回。否则,我们就返回根节点的值。

def kthSmallest(root, k):
    def inorder(node):
        if not node:
            return
        inorder(node.left)
        self.count += 1
        if self.count == k:
            self.res = node.val
            return
        inorder(node.right)

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

解法二:基于栈

我们也可以使用基于栈的方法来解决这个问题。我们首先将根节点压入栈中。然后,我们重复以下步骤,直到栈为空:

  1. 弹出栈顶元素 node。
  2. 如果 node 的左子树不为空,则将 node 的左子树的根节点压入栈中。
  3. 如果 node 的右子树不为空,则将 node 的右子树的根节点压入栈中。

当栈为空时,我们返回栈顶元素的值,即第 k 小的元素。

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

    return None

示例

root = TreeNode(5)
root.left = TreeNode(3)
root.right = TreeNode(6)
root.left.left = TreeNode(2)
root.left.right = TreeNode(4)
root.right.right = TreeNode(7)

k = 3

result = kthSmallest(root, k)

print(result)  # 输出:4

总结

在这篇博客文章中,我们介绍了两种方法来解决 LeetCode 230:二叉搜索树中第 K 小的元素。我们还提供了一些示例代码和测试结果,以帮助您理解如何使用这些方法。希望这篇博客文章对您有所帮助!