一、需求
- 给定一个二叉搜索树的根节点
root
,和一个整数k
,请你设计一个算法查找其中第k
个最小元素(从 1 开始计数)。
输入:root = [3,1,4,null,2], k = 1 输出:1
提示:
- 树中的节点数为
n
。1 <= k <= n <= 104
0 <= Node.val <= 104
进阶:如果二叉搜索树经常被修改(插入/删除操作)并且你需要频繁地查找第
k
小的值,你将如何优化算法?
二、递归法
2.1 思路分析
- 将BST的中序遍历存储到集合中,直接获取第k个元素返回;
2.2 代码实现
class Solution {
List<Integer> res = new ArrayList<>();
public int kthSmallest(TreeNode root, int k) {
helper(root);
return res.get(k-1);
}
private void helper(TreeNode root) {
if(root == null) {
return;
}
helper(root.left);
res.add(root.val);
helper(root.right);
}
}
2.3 复杂度分析
- 时间复杂度为O(N);
- 空间复杂度为O(N);
三、迭代法
3.1 思路分析
- 该算法也是基于中序遍历的迭代法框架演变而来,在中序遍历过程中,我们只要返回第k个元素即可;
3.2 代码实现
class Solution {
public int kthSmallest(TreeNode root, int k) {
Deque<TreeNode> stack = new ArrayDeque<>();
TreeNode node = root;
while(node != null || !stack.isEmpty()) {
while(node != null) {
stack.push(node);
node = node.left;
}
node = stack.pop();
k--;
if(k == 0) {
return node.val;
}
node = node.right;
}
return 0;
}
}
3.3 复杂度分析
- 时间复杂度为O(N),最坏情况下,二叉树退化为链表,需要添加所有的节点;
- 空间复杂度为O(N),最坏情况下,栈需要存储所有的节点;