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

题目描述:给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。如果二叉搜索树经常被修改(插入/删除操作)并且你需要频繁地查找第 k 小的值,你将如何优化算法?

代码实现

中序实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
private List<TreeNode> nodes = new ArrayList<>();

public int kthSmallest(TreeNode root, int k) {
inorders(root);
return nodes.get(k).val;
}

public void inorders(TreeNode root){
if (root == null){
return;
}
inorders(root.left);
nodes.add(root);
inorders(root.right);
}
}

递归优化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
private int idx = 0;
private int idxVal = 0;

public int kthSmallest(TreeNode root, int k) {
inorders(root, k);
return idxVal;
}

public void inorders(TreeNode root, int k) {
if (root == null) {
return;
}
inorders(root.left, k);
idx++;
if (idx == k) {
idxVal = root.val;
}
inorders(root.right, k);
}
}