剑指 Offer 54. 二叉搜索树的第k大节点

231 阅读1分钟

剑指 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)个
}