本文最后更新于:2021年1月26日 晚上
给定一个二叉搜索树,编写一个函数 kthSmallest
来查找其中第 k 个最小的元素。
说明:
你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。
示例 1:
| 输入: root = [3,1,4,null,2], k = 1 3 / \ 1 4 \ 2 输出: 1
|
示例 2:
| 输入: root = [5,3,6,2,4,null,null,1], k = 3 5 / \ 3 6 / \ 2 4 / 1 输出: 3
|
进阶:
如果二叉搜索树经常被修改(插入/删除操作)并且你需要频繁地查找第 k 小的值,你将如何优化 kthSmallest
函数?
Solution
- 用 vector 存储中序遍历结果,返回第 k 个元素
- 递归法
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
|
class Solution { public: int kthSmallest(TreeNode* root, int k) { vector<int> res; inOrder(root, res); return res[k-1]; }
void inOrder(TreeNode* root, vector<int>& res){ if(root){ inOrder(root->left, res); res.push_back(root->val); inOrder(root->right, res); } } };
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| class Solution { public: int kthSmallest(TreeNode* root, int k) { stack<TreeNode *> s; TreeNode* node = root; s.push(node); while(node!=nullptr || !s.empty()){ while(node){ s.push(node); node = node->left; } node = s.top(); s.pop(); k--; if(k==0) return node->val; node = node->right; } return -1; } };
|