[路飞]_230. 二叉搜索树中第K小的元素

118 阅读1分钟

题目介绍

给定一个二叉搜索树的根节点 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
};