力扣 230. 二叉搜索树中第 K 小的元素

44 阅读1分钟

🔗 leetcode.cn/problems/kt…

题目

  • 给定一个二叉搜索树的根节点,返回其中第 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;
    }
};