二叉搜索树的第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 ≤ 二叉搜索树元素个数
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/er… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
// 二叉搜索树:该树的左节点的值必定比根节点的值小,右节点的值必定比根节点的值大
// 因为题目要求找到第K大的节点,所以先判断右子树的值的数量是否满足我们需要找的K
// 右树 >= K,则我们需要找的值在右子树中
// 右树 = K-1,则我们需要找的值在根节点中
// 右树 < K+1,则我们需要找的值在左子树中
代码
var kthLargest = function (root, k) {
// 先计算root的右节点的个数
let conR = countNodes(root.right);
// 然后判断需要找的值在什么区间内,进行递归遍历
if (k <= conR) return kthLargest(root.right, k);
if (k == conR + 1) return root.val;
if (k > conR) return kthLargest(root.left, k - conR - 1);
};
var countNodes = function (root) {
if (!root) return 0;
return countNodes(root.left) + countNodes(root.right) + 1;
}
这个是中序遍历的方法↓
var kthLargest = function (root, k) {
let ans = [];
countNodes(root, ans)
return ans[ans.length - k];
};
var countNodes = function (root, ans) {
if (!root) return;
countNodes(root.left, ans);
ans.push(root.val);
countNodes(root.right, ans);
return ans;
}