题目描述

[EN | CN]

给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。

说明:

你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。

示例 1:

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

示例 2:

1
2
3
4
5
6
7
8
9
输入: root = [5,3,6,2,4,null,null,1], k = 3
       5
      / \
     3   6
    / \
   2   4
  /
 1
输出: 3

进阶:

如果二叉搜索树经常被修改(插入/删除操作)并且你需要频繁地查找第 k 小的值,你将如何优化 kthSmallest 函数?

解法 1:中序遍历+迭代

对于二叉搜索树的一个结点,左子结点的值小于自己,右子结点的值大于自己,因此我们按照中序遍历来遍历二叉搜索树,该序列的第 k 个结点就是第 k 小的结点。

复杂度分析略。

实现与结果如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def kthSmallest(self, root: TreeNode, k: int) -> int:
        stack = []
        curr = root
        count = 1

        while True:
            while curr:
                stack.append(curr)
                curr = curr.left
            curr = stack.pop()
            if count == k:
                return curr.val
            count += 1
            curr = curr.right
  • 执行用时:64 ms,在所有 Python3 提交中击败了 61.00% 的用户。
  • 内存消耗:17.7 MB,在所有 Python3 提交中击败了 7.14% 的用户。