剑指 Offer 54. 二叉搜索树的第k大节点(反中序遍历+提前返回)

题目:

链接:剑指 Offer 54. 二叉搜索树的第k大节点
难度:简单

给定一棵二叉搜索树,请找出其中第 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

限制:

  • 1 ≤ k ≤ 二叉搜索树元素个数

反中序遍历+提前返回:

前提是我们知道题中给的是二叉搜索树,根据其性质可知,中序遍历的话我们将获得从小到大的元素值,所以恰好可以用反向的中序遍历(右-中-左)来获得从大到小的元素值,进一步得第k大的元素值。
然后在遍历过程中计数,在找到第k大值后提前结束(返回)。

代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int K, i = 0, ans;
    int kthLargest(TreeNode* root, int k) {
        K = k;
        search(root);
        return ans;
    }
    void search(TreeNode* root) {
        if(root == nullptr) return;
        search(root->right);
        i++;
        if(i == K) {
            ans = root->val;
            return;
        }
        else if(i > K) return;
        search(root->left);
    }
};

时间复杂度O(N)。
空间复杂度O(N)。在二叉树退化为链表时取得。

你可能感兴趣的:(剑指Offer,刷题,数据结构,算法,链表,c++,leetcode)