给定一棵二叉搜索树,请找出其中第 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 ≤ 二叉搜索树元素个数
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/er-cha-sou-suo-shu-de-di-kda-jie-dian-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
这道题我们的思路就是对于二叉搜索树,使用中序遍历可以获取到从小到大的数据,也就是先访问root->left,再访问root,最后访问root->right。
但是我们这里想到的到的是第k大的数据,所以我们需要从后往前遍历,也就是说我们需要先访问root->right,再访问root,最后访问root->left。
每访问一次数据我们就将我们的k--,直到k=0,返回我们的root->val
- /**
- * Definition for a binary tree node.
- * struct TreeNode {
- * int val;
- * TreeNode *left;
- * TreeNode *right;
- * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
- * };
- */
- class Solution {
- public:
- int count=0;
- int result=0;
- int kthLargest(TreeNode* root, int k) {
- count=k;
- inorder_traversal(root);
- return result;
-
- }
- void inorder_traversal(TreeNode* root)
- {
- if(root==nullptr||count==0)
- {
- return;
- }
- inorder_traversal(root->right);
- if(count==0)
- {
- return;
- }
- if(--count==0)
- {
- result=root->val;
- return;
- }
- inorder_traversal(root->left);
- }
- };
5
/ \
3 6
/ \
2 4
/
1
