54.二叉搜索树的第k大节点
给定一棵二叉搜索树,请找出其中第k大的节点。
中序遍历
中序遍历得到递增序列
class Solution {
vector<int> ans;
void traverse(TreeNode* root){
if(root == NULL) return;
traverse(root->left);
ans.push_back(root->val);
traverse(root->right);
}
public:
int kthLargest(TreeNode* root, int k) {
traverse(root);
return ans[ans.size() - k];
}
};
改进 中序遍历 逆中序
class Solution {
public:
int res=0;
int n=0;
int kthLargest(TreeNode* root, int k) {
dfs(root,k);
return res;
}
void dfs(TreeNode* root,int k){
if(root==NULL)return ;
if(root->right)dfs(root->right,k);
n++;
if(n==k)res=root->val;
if(root->left)dfs(root->left,k);
return ;
}
};
迭代
class Solution {
public:
int kthLargest(TreeNode* root, int k) {
stack<TreeNode*>sk;
int n=0;
while(!sk.empty()||root){
while(root){
sk.push(root);
root=root->right;
}
root=sk.top();
sk.pop();
n++;
if(n==k)return root->val;
root=root->left;
}
return 0;
}
};