【剑指Offer-54】二叉搜索树的第k大节点

问题

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

解答1:递归

class Solution {
public:
    int kthLargest(TreeNode* root, int k) {
        if (!root || flag) return res; // 使用flag跳出递归
        kthLargest(root->right, k);
        if (++cnt == k) {
            res = root->val;
            flag = 1;
        }
        kthLargest(root->left, k);
        return res;
    }
private:
    int cnt = 0, res = -1, flag = 0;
};

重点思路

中序遍历二叉搜索树可以得到递增序列。遍历到第k个时跳出所有递归,这里使用一个flag实现。注意,这里求的是第k大节点,所以中序要反向。

解答2:迭代

class Solution {
public:
    int kthLargest(TreeNode* root, int k) {
        stack<TreeNode*> s;
        TreeNode* cur = root;
        while (!s.empty() || cur) {
            while (cur) {
                s.push(cur);
                cur = cur->right;
            }
            cur = s.top(); s.pop();
            if (--k == 0) return cur->val; // 中序操作
            cur = cur->left;
        }
        return -1;
    }
};
posted @ 2021-03-06 11:07  tmpUser  阅读(38)  评论(0编辑  收藏  举报