题目
题目链接:力扣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
提示:
- 树中的节点数为
n
。 - 1 <= k <= n <= 104
- 0 <= Node.val <= 104
进阶:如果二叉搜索树经常被修改(插入/删除操作)并且你需要频繁地查找第 k
小的值,你将如何优化算法?
解题思路
👉中序遍历
由于题目给的二叉树是二叉搜索树,所以可以根据中序遍历,把节点值存入数组中再直接返回第 K
大的数。这种方法比较简单,官方给的第二种方法比较麻烦,我就说一下大体的思路吧。第三种方法我是真的看不下去,直接手撕平衡树了,有兴趣的可以自己去看看。
👉优化
对于频繁的查找是可以优化的。
因为树是二叉树,所以想确定第 k
小的数的位置,可以根据树的子节点数确定第 K
小的数。这里用一个哈希表存储每个根节点的子节点数,这样可以遍历二叉树的节点查找第 k
小的数。
- 如果节点的左子树的节点数小于
k-1
,那么第k
小的数一定在其右子树上 - 如果等于,那么当前节点就是第
k
小 - 如果大于,那就在左子树上
代码(C++)
中序遍历
class Solution {
public:
vector<int> nums;
void dfs(TreeNode *root) {
if (!root)