跳转至

230. 二叉搜索树中第K小的元素

题目

给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。

示例 1:

输入:root = [3,1,4,null,2], k = 1

输出:1

示例 2:

输入:root = [5,3,6,2,4,null,null,1], k = 3

输出:3

复杂度

  • 时间复杂度:\(O(H+k)\),其中 \(H\) 是树的高度。
    • 在开始遍历之前,我们需要 \(O(H)\) 到达叶结点。当树是平衡树时,时间复杂度取得最小值 \(O(\log N + k)\);当树是线性树(树中每个结点都只有一个子结点或没有子结点)时,时间复杂度取得最大值 \(O(N+k)\)
  • 空间复杂度:\(O(H)\),栈中最多需要存储 \(H\) 个元素。
    • 当树是平衡树时,空间复杂度取得最小值 \(O(\log N)\);当树是线性树时,空间复杂度取得最大值 \(O(N)\)

题解

Go
func kthSmallest(root *TreeNode, k int) int {
    stack := []*TreeNode{}
    for {
        for root != nil {
            stack = append(stack, root)
            root = root.Left
        }
        stack, root = stack[:len(stack)-1], stack[len(stack)-1]
        k--
        if k == 0 {
            return root.Val
        }
        root = root.Right
    }
}
Python
class Solution:
    def kthSmallest(self, root: TreeNode, k: int) -> int:
        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

参考