题目介绍
给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。
示例 1:
输入:root = [3,1,4,null,2], k = 1 输出:1 示例 2:
输入:root = [5,3,6,2,4,null,null,1], k = 3 输出:3
提示:
树中的节点数为 n 。 1 <= k <= n <= 104 0 <= Node.val <= 104
进阶:如果二叉搜索树经常被修改(插入/删除操作)并且你需要频繁地查找第 k 小的值,你将如何优化算法?
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/kt… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
搜索二叉树的特性是左边节点值比右边的小,所以如果左子树的节点值大于等于k的话,说明在左子树上面,如果刚好等于左子树的节点 + 1的话就是在根节点上面,否则就是在有节点上面
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @param {number} k
* @return {number}
*/
function getCount(root) {
if (!root) return 0
return getCount(root.left) + getCount(root.right) + 1
}
// 搜索二叉树是左边比有边小,前序遍历就是一个升序排列
var kthSmallest = function(root, k) {
let c_f = getCount(root.left)
if (c_f >= k) return kthSmallest(root.left, k)
if (c_f + 1 === k) return root.val
return kthSmallest(root.right, k - c_f - 1)
// let ans
// function kthSmallestFn(root) {
// if (!root) return
// kthSmallestFn(root.left)
// if (--k === 0) ans = root.val
// kthSmallestFn(root.right)
// }
// kthSmallestFn(root)
// return ans
};