剑指 Offer 54. 二叉搜索树的第k大节点
给定一棵二叉搜索树,请找出其中第 k 大的节点的值。
示例 1:
输入: root = [3,1,4,null,2], k = 1
3
/ \
1 4
\
2
输出: 4
知识点-greater()和less()使用方法!
老是忘,这里再记一下笔记
注意大顶堆里面是less,小顶堆里面是greater
sort(vec.begin(),vec.end(),greater<int>());//内置类型从大到小
sort(vec.begin(),vec.end(),less<int>()); //内置类型小大到大
//注意大顶堆里面是less,小顶堆里面是greater
priority_queue<int,vector<int>,less<int> > big_heap2;
priority_queue<int,vector<int>,greater<int> > small_heap;
题解1-利用BST性质-中序遍历【推荐】
/**
* 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 ans, cnt;
void traval(TreeNode* root){
if(root == NULL) return;
traval(root->right);
if(--cnt == 0) ans = root->val;
traval(root->left);
}
int kthLargest(TreeNode* root, int k) {
cnt = k;
traval(root);
return ans;
}
};
题解2-简单粗暴没用BST性质【没用】
/**
* 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:
vector<int> vec;
void traval(TreeNode* root){
if(root == NULL) return;
vec.push_back(root->val);
traval(root->left);
traval(root->right);
}
int kthLargest(TreeNode* root, int k) {
traval(root);
sort(vec.begin(), vec.end(), greater<int>());
return vec[k - 1];
}
};