[剑指offer]二叉搜索树的第k大节点
题目描述
给定一棵二叉搜索树,请找出其中第k大的节点。
示例 1:
输入: root = [3,1,4,null,2], k = 1
3
/ \
1 4
\
2
输出: 4
示例 2:
输入: root = [5,3,6,2,4,null,null,1], k = 3
5
/ \
3 6
/ \
2 4
/
1
输出: 4
限制:
1 ≤ k ≤ 二叉搜索树元素个数
解题思路
- 二叉搜索树特点:节点的左边都比它小,右边都比它大
- 利用树的中序遍历可以得到从小到大的排序结果
- 可以利用右根左的思路中序遍历,即右→中→左的顺序中序遍历,就可以得到从大到小的排序结果
实现代码
class Solution {
public:
vector<int> res;
int kthLargest(TreeNode* root, int k) {
helper(root);
return res[k-1];//第k-1个位置就是第k大的数
}
void helper(TreeNode* root){
if(root==NULL)
return;
if(root->right!=NULL)helper(root->right);//先右
res.push_back(root->val);
if(root->left!=NULL)helper(root->left);//后左
}
};
因为结果是要得到第k大的数,所以可以使用一个变量替代数组,在找到第k大的数后就停止。
class Solution {
public:
int res=0,count=1;//count代表第几大
int kthLargest(TreeNode* root, int k) {
helper(root,k);
return res;
}
void helper(TreeNode* root,int k){
if(root==NULL)
return;
if(root->right!=NULL)helper(root->right,k);
if(count++==k){//找打第k大的就return
res=root->val;
return;
}
if(root->left!=NULL)helper(root->left,k);
}
};