二叉搜索树的第k大节点

· 约 1 分钟阅读 · 次阅读 leetcode

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


中序遍历然后取倒数第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 {
    void inOrder(TreeNode* root, vector<int>& ans) {
        if (root == NULL){
            return;
        }
        inOrder(root->left, ans);
        ans.emplace_back(root->val);
        inOrder(root->right, ans);
    }
public:
    int kthLargest(TreeNode* root, int k) {
        vector<int> result;
        inOrder(root, result);
        int n = result.size();
        if (n < k){
            return -1;
        }
        return result[n-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 {
    int left, ans;
    void inOrder(TreeNode* root) {
        if (root == NULL){
            return;
        }
        if (left == 0){
            return;
        }
        inOrder(root->right);
        if (--left == 0) {
            ans = root->val;
        }
        inOrder(root->left);
    }
public:
    int kthLargest(TreeNode* root, int k) {
        left = k;
        inOrder(root);
        return ans;
    }
};