剑指 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 ≤ 二叉搜索树元素个数
解题思路
使用递归的中序遍历二叉树, 在遍历的同时进行计数, 当计数值小于K时, 继续遍历, 等于K时, 返回当前节点值, 大于K时, 直接返回值。
class Solution {
private int curSeq = 0;
int res = 0;
public int kthLargest(TreeNode root, int k) {
if (root == null) {
return 0;
}
// 先遍历右子树
kthLargest(root.right, k);
// 然后遍历当前节点, 并且计数器自增
curSeq++;
if (curSeq == k) {
// 计数器为K, 说明当前是RNL遍历的第K个节点 全局变量保存当前的结果
res = root.val;
} else if (curSeq < k) {
// 如果当前节点还是小于K, 则继续递归遍历左子树
kthLargest(root.left, k);
}
// 返回结果, 若遍历完左子树之后还是小于K, 当前的结果还不是最终的结果
return res;
}
}