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