题目

  • 给定一棵二叉搜索树,请找出其中第 k 大的节点的值。

示例

  • 示例1

输入: root = [3,1,4,null,2], k = 1

   3
  / \
 1   4
  \
   2

输出: 4

  • 示例2

输入: root = [5,3,6,2,4,null,null,1], k = 3

       5
      / \
     3   6
    / \
   2   4
  /
 1

输出: 4

代码

解法:遍历

class Solution {
public:
    // 右根左遍历 --> 倒序
    vector<int> res;
    int kthLargest(TreeNode* root, int k) {
        tranverse(root,k);
        return res[k-1];
    }
    void tranverse(TreeNode* root, int& k){
        if(root == NULL)    return;
        if(res.size() == k)    return;
        tranverse(root->right,k);
        res.push_back(root->val);
        tranverse(root->left,k);
    }
};

代码分析:一般做法应该就是这种,用右根左的顺序去遍历二叉搜索树,得到一个降序序列。这一步做优化

if(res.size() == k)    return;

拿到前 k 个就可以了,其他的用不着。但是我使用了 $O(n)$ 外部空间,应该是能优化掉的。

class Solution {
    int res=0;
    void dfs(TreeNode* root,int& k)
    {
        if(!root || k == 0) return;
        dfs(root->right,k);
        k--;
        if(k == 0) res = root->val;
        dfs(root->left,k);
    }
public:
    int kthLargest(TreeNode* root, int k) {
        dfs(root,k);
        return res;
    }
};

这样就好了,空复 $O(1)$

题目二叉搜索树的第k大节点

最后修改:2022 年 01 月 21 日 11 : 36 AM
如果我的文章对你有用,请随意赞赏