[LeetCode] 230. Kth Smallest Element in a BST

Given the root of a binary search tree, and an integer k, return the kth smallest value (1-indexed) of all the values of the nodes in the tree.

Example 1:
Example 1
Input: root = [3,1,4,null,2], k = 1
Output: 1

Example 2:
Example 2
Input: root = [5,3,6,2,4,null,null,1], k = 3
Output: 3

Constraints:
The number of nodes in the tree is n.
1 <= k <= n <= 104
0 <= Node.val <= 104

Follow up: If the BST is modified often (i.e., we can do insert and delete operations) and you need to find the kth smallest frequently, how would you optimize?

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

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

思路

因为是 BST 所以大概率会考察中序遍历,即中序遍历的结果是升序的。这道题的最优解就是按照中序遍历的方法去遍历 BST 的节点,用 count 记录是否到 k,输出第 k 个节点即可。影子题 671。

复杂度

迭代的做法和递归的做法复杂度一样。
时间O(n)
空间O(n)

Java递归实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
private static int count;
private static int res;

public int kthSmallest(TreeNode root, int k) {
count = k;
helper(root);
return res;
}

public void helper(TreeNode root) {
if (root == null) {
return;
}
helper(root.left);
count--;
if (count == 0) {
res = root.val;
}
helper(root.right);
}
}

Java迭代实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public int kthSmallest(TreeNode root, int k) {
Stack<TreeNode> stack = new Stack<>();
TreeNode cur = root;
stack.push(cur);
int count = 0;
while (cur != null || !stack.isEmpty()) {
while (cur != null) {
stack.push(cur);
cur = cur.left;
}
cur = stack.pop();
count++;
if (count == k) {
return cur.val;
}
cur = cur.right;
}
return -1;
}
}

JavaScript递归实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
* @param {TreeNode} root
* @param {number} k
* @return {number}
*/
var kthSmallest = function (root, k) {
let count = k;
let res = 0;

let helper = function (root) {
if (root == null) {
return;
}
helper(root.left);
count--;
if (count == 0) {
res = root.val;
}
helper(root.right);
}
helper(root);
return res;
};

JavaScript迭代实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
* @param {TreeNode} root
* @param {number} k
* @return {number}
*/
var kthSmallest = function (root, k) {
let stack = [];
while (root != null || stack.length > 0) {
if (root != null) {
stack.push(root);
root = root.left;
} else {
root = stack.pop();
k--;
if (k == 0) {
return root.val;
}
root = root.right;
}
}
return -1;
};

相关题目

1
2
230. Kth Smallest Element in a BST
671. Second Minimum Node In a Binary Tree

[LeetCode] 230. Kth Smallest Element in a BST
https://shurui91.github.io/posts/1608621597.html
Author
Aaron Liu
Posted on
March 20, 2020
Licensed under