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

125 阅读1分钟

题目

给定一棵二叉搜索树,请找出其中第 k 大的节点的值。

示例

输入: root = [3,1,4,null,2], k = 1
   3
  / \
 1   4
  \
   2
输出: 4

解题思路

因为给的是一个搜索二叉树的根节点,根据搜索二叉树的特性,左节点 < 跟节点 < 右节点,所以搜索二叉树的中序遍历是一个递增序列,那么,反中序遍历(后中前)就是递减序列,所以先递归记录根节点右边节点的值,再记录左边节点的值,到第k个时即为结果;对于记录大于k个的值,可以不遍历,提高性能。

/**
 * @param {TreeNode} root
 * @param {number} k
 * @return {number}
 */
var kthLargest = function(root, k) {
    // 递减序列从0开始记录
    let count = 0;
    let result = null; // 需要返回的结果

    // 递归函数:对每个节点,先将右节点全部记录到count,再count++(当前节点),如果count === k了则直接记录结果节点。最后记录左节点的count
    function getDfs(node) {
        if (!node) return;
        getDfs(node.right);
        count++;
        if (count === k) {
            result = node.val;
            return;
        }

        getDfs(node.left);
    }

    // 递归求得count的值
    getDfs(root);
    return result;
};