方法:
中序遍历,迭代,深度递归(优先队列)
解题思路
一 中序遍历
中序遍历是:左子树-父节点-右子树,题目是二叉搜索树,故采用中序遍历的话,值是从小到大依次遍历输出的,套用二叉树的解题模板c++二叉树:层序,前,中,后 序遍历的解题模板,将中序遍历的值存入vector,则倒数第k大的值在vec.size()-k的位置。
代码
class Solution {
public:
int kthLargest(TreeNode* root, int k) {
//中序:左子树-父节点-右子树
TreeNode* p = root;
vector<int> data;
stack<TreeNode*> st;
while (p||!st.empty()) {
if (p) {
st.push(p);
p = p->left;
}
else {
p = st.top();
st.pop();
data.push_back(p->val);//
cout << p->val << " ";
p = p->right;
}
}
return data[data.size()-k];
}
};
二 迭代
右-根-左的遍历方式,因为右>根>左,所以从最右端的根依次出栈,知道k --==0,就返回此时的栈顶元素的值。
class Solution {
public:
int kthLargest(TreeNode* root, int k) {
stack<TreeNode*>sta;
TreeNode* p=root;
while(!sta.empty()||k){
while(p){
sta.push(p);
p=p->right;
}
cout<<sta.top()->val<<" ";
TreeNode* temp=sta.top();
--k;
if(!k)return sta.top()->val;
sta.pop();
if(temp->left)
p=temp->left;
}
return -1;
}
};
三 深度递归
采用priority_queue ,用了最大堆,先将所有的元素一次推入priority_queue,然后再每次弹出一个,知道弹出的第k个
class Solution {
public:
priority_queue<int> pri_que;
int kthLargest(TreeNode* root, int k) {
dfs(root);
int n;
while( k){
n=pri_que.top();
k--;
cout<<n<<"--";
pri_que.pop();
}
return n;
}
void dfs(TreeNode* root){
pri_que.push(root->val);
if(root->left)dfs(root->left);
if(root->right)dfs(root->right);
}
};