剑指 Offer 54. 二叉搜索树的第k大节点

方法一:

由于是有序的平衡二叉树,因此是中序。根据dfs中序迭代求得递增排序后,再反转就可求得结果。

复制代码
class Solution {
public:
    vector<int> tmp;
    int kthLargest(TreeNode* root, int k) {
        // if(root != NULL) return 
        dfs(root);
        reverse(tmp.begin(), tmp.end());
        return tmp[k -1];
    }
    void dfs(TreeNode* root) {
        if(root == NULL) return;
        dfs(root->left);
        tmp.emplace_back(root->val);
        dfs(root->right);
    }
};
复制代码
时间28 ms
内存23.8 MB

方法二:

改进:直接将中序遍历改成右->根->左,这样既省去了开辟额外的数组,又省去了最后的reverse的O(n)算法复杂度。

注意:dfs迭代是,传递的k是引用!!

复制代码
class Solution {
public:
    int res;
    int kthLargest(TreeNode* root, int k) {
        dfs(root, k);
        return res;
    }
    void dfs(TreeNode *root, int &k) {
        if(root == NULL || k <= 0) return;
        dfs(root->right, k);
        k --;
        if(k == 0) {
            res = root->val;
            return;
        }
        dfs(root->left, k);
    }
};
复制代码
时间20 ms
内存23.4 MB

 

posted @   luxiayuai  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示