剑指 Offer 54. 二叉搜索树的第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 ≤ 二叉搜索树元素个数
题解
- 我们都知道二叉搜索树的性质:中序遍历(根左右)后得到是从小到大的顺序 ;
- 同理我们采用中序遍历(根右左)得到的是从大到小的顺序 ;
- 我们在中序遍历二叉树的过程中维护一个数组,将遍历的值保存下来
- 由于是从1开始第k大,就遍历数组输出第k个元素即可
/*
根左右得出从小到大的顺序 ;
根右左得出从大到小的顺序
*/
class Solution {
public:
int kthLargest(TreeNode* root, int k) {
vector<int> res = {0} ;
inorder(root,res) ;
for(int i =1 ; i < res.size() ; i ++){
cout << res[i] << " " ;
if(i == k) return res[i] ;
}
return 0 ;
}
void inorder(TreeNode * root , vector<int> &res){
if (!root) return;
inorder(root->right, res);
res.push_back(root->val);
inorder(root->left, res);
}
};