题目
- 给定一个二叉搜索树的根节点,返回其中第 k 小的元素
思路
-
官方题解中给了两个思路:
- 用迭代的方式中序遍历,遍历到第 k 个便是答案
- 统计每个树木的节点数,通过二分的方法,进入到左树木或者右树木
-
自己写的思路是,把树转化成了有序列表,返回其中第 K 个元素,性能不优,能 AC
-
进阶提问,如果二叉搜索树频繁修改(插入&删除),且频繁查询第 k 小的值,优化的思路就是把二叉搜索树转化为平衡二叉树,这部分放在题目 1382 中单独说明
代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
list<int> tree_to_list(TreeNode* node) {
list<int> left;
if (node == nullptr) return left;
left = tree_to_list(node->left);
left.push_back(node->val);
list<int> right = tree_to_list(node->right);
left.splice(left.end(), right);
return left;
}
int kthSmallest(TreeNode* root, int k) {
list<int> l;
l = tree_to_list(root);
auto it = l.begin();
std::advance(it, k-1);
return *it;
}
};