二叉搜索树的第k大节点

178 阅读1分钟

二叉搜索树的第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;
}