题目
给定一棵二叉搜索树,请找出其中第 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;
};