题目描述:
给定一棵二叉搜索树,找出其中第k大的节点。
解题思路:
从二叉搜索树的定义可知,对二叉搜索树进行中序遍历就可以得到一个按关键字从大到小的一个递增有序序列,通过其递增序列获得第k大节点。
代码
class Solution {
public:
int kthLargest(TreeNode* root, int k) {
int res = 0;//先进行中序遍历,再返回第k大节点
if(root == NULL || k <= 0) return res;
vector<int> arr;
stack<TreeNode *> s;
TreeNode *p = root;
while(p || !s.empty()){
while(p){
s.push(p);
p = p->left;
}
if(!s.empty()){
p = s.top();
s.pop();
arr.push_back(p->val);
p = p->right;
}
}
if(k > arr.size())//若k超出范围
return res;
else
return arr[arr.size() - k];
}
};
改进
上面算法空间复杂度为O(n),我们对二叉搜索树进行逆中序遍历得到递减序列,获得第k大节点后返回。算法的空间复杂度为O(1) 。
class Solution {
public:
int kthLargest(TreeNode* root, int k) {
int res = -1; //逆中序遍历,直接获得第k大节点后返回
int count = 0;
if(root == NULL || k <= 0) return res;
stack<TreeNode*> s;
TreeNode *p = root;
while(p || !s.empty()){
while(p){
s.push(p);
p = p->right;
}
if(!s.empty()){
p = s.top();
s.pop();
count++;
if(count == k)
return p->val;
p = p->left;
}
}
return res;
}
};