如果你想在校招中顺利拿到更好的offer,阿秀建议你多看看前人的经验 ,比如准备 、简历 、实习 、校招总结 、offer选择 、也欢迎来一起参加秋招打卡活动 等;如果你是计算机小白,学习/转行/校招路上感到迷茫或者需要帮助,可以点此联系阿秀;免费分享阿秀个人学习计算机以来的收集到的好资源,点此白嫖;如果你需要《阿秀的学习笔记》网站中求职相关知识点的PDF版本的话,可以点此下载
# 230. 二叉搜索树中第K小的元素 (opens new window)
给定一个二叉搜索树,编写一个函数 kthSmallest
来查找其中第 k 个最小的元素。
说明: 你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。
示例 1:
输入: root = [3,1,4,null,2], k = 1
3
/ \
1 4
\
2
输出: 1
1
2
3
4
5
6
7
2
3
4
5
6
7
示例 2:
输入: root = [5,3,6,2,4,null,null,1], k = 3
5
/ \
3 6
/ \
2 4
/
1
输出: 3
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
进阶:
如果二叉搜索树经常被修改(插入/删除操作)并且你需要频繁地查找第 k 小的值,你将如何优化 kthSmallest
函数?
# 1、自己写的笨方法,先全部保存下来再进行排序,时间复杂度太大
执行用时:36 ms, 在所有 C++ 提交中击败了38.06%的用户
内存消耗:26.3 MB, 在所有 C++ 提交中击败了5.00%的用户
int kthSmallest(TreeNode* root, int k) {
map<int, TreeNode*> result;
queue<TreeNode*> q;
q.push(root);
TreeNode* node;
while (!q.empty()) {
node = q.front();
q.pop();
result.insert({node->val,node});
if (node->left) q.push(node->left);
if (node->right) q.push(node->right);
}
map<int, TreeNode*>::const_iterator it;
it = result.begin();
while (--k) it++;
return it->first;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 2、借助二叉树迭代遍历模板的一种写法
int kthSmallest(TreeNode* root, int k) {
stack<TreeNode*> s;
int num = 0;
while (!s.empty() || root!=nullptr)
{
if (root !=nullptr)
{
s.push(root);
root = root->left;
}
else
{
root = s.top();
s.pop();
num++;
if (num == k)
return root->val;
root = root->right;
}
}
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 3、二叉树递归遍历的一种写法
执行用时:32 ms, 在所有 C++ 提交中击败了59.00%的用户
内存消耗:24 MB, 在所有 C++ 提交中击败了5.00%的用户
void kthSmallestCore(TreeNode* root, int& k, int& ans) {
if (root == nullptr) return;
if (root->left) kthSmallestCore(root->left, k, ans);
k--;
if (k == 0) {
ans = root->val;
}
if(root->right) kthSmallestCore(root->right, k, ans);
}
int kthSmallest(TreeNode* root, int k) {
int ans = 0;
kthSmallestCore(root, k, ans);
return ans;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16