给定一棵二叉搜索树,请找出其中第 k 大的节点的值。
思路
中序遍历结果就是二叉搜索树的排序结果,如果第一大是最小的数,就是正常的中序遍历。如果第一大是最大的数,就是中序遍历的到序,遍历时,先遍历右子树,再遍历左子树。
代码
class Solution {
private:
TreeNode* desNode;
int ak;
public:
void kLargest(TreeNode* root) {
if(root == nullptr || ak <= 0) return;
kLargest(root->right);
if(--ak == 0) {
desNode = root;
}
kLargest(root->left);
}
int kthLargest(TreeNode* root, int k) {
if(root == nullptr) return INT_MIN;
ak = k;
kLargest(root);
return desNode->val;
}
};