剑指 Offer 54. 二叉搜索树的第k大节点
给定一棵二叉搜索树,请找出其中第k大的节点。
输入: root = [3,1,4,null,2], k = 1
3
/ \
1 4
\
2
输出: 4
二叉搜索树的特性: 左子节点的值小于根节点的值,右子节点的值大于根节点的值。
所以我们可以通过右子节点数与k比较,来判定第k大的节点在左子节点还是右子节点。
假设右节点数cnt
// 所以呢我们求节点数的函数是
var getCount = function (root){
if(root==null) return 0
return getCount(root.left) + getCount(root.right)+1
}
那么我们可以确定一下边界条件:
(1) 当k = cnt + 1 那么第k大节点是根节点
(2) 当k <= cnt 那么第k大节点在右子节点里, 否则 第k大节点在左子节点里
// 我们首先求右子节点的数与k的比较
var kthLargest = function(root, k){
var cnt = getCount(root.right)
if(k<=cnt) return kthLargest(root.right, k)
if(k==cnt+1) return root.val
return kthLargest(root.left, k-cnt-1) // 就是当前左子数作为根节点时,需要排除掉根节点和右子树的数量算出第K(k-cnt-1)个
}