Typescript-Algorithms
    Preparing search index...

    Variable kth_smallest_element_in_a_bstConst

    kth_smallest_element_in_a_bst: (root: null | TreeNode, k: number) => number = kthSmallest

    230.二叉搜索树中第K小的元素

    给你一棵二叉搜索树的根节点 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 <= 10^4
    • 0 <= Node.val <= 10^4

    • 如果二叉搜索树经常被修改(插入/删除操作)并且你需要频繁地查找第 k 小的值,你将如何优化算法?

    Type declaration

      • (root: null | TreeNode, k: number): number
      • Definition for a binary tree node. class TreeNode { val: number left: TreeNode | null right: TreeNode | null constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) { this.val = (val===undefined ? 0 : val) this.left = (left===undefined ? null : left) this.right = (right===undefined ? null : right) } }

        Parameters

        • root: null | TreeNode
        • k: number

        Returns number

    1. 利用二叉搜索树的中序遍历结果是升序的特性,来判断是否是二叉搜索树。
    2. 中序遍历的顺序是:左根右。
    3. 在遍历的过程中,收集第 k 个节点。
    4. 返回收集到的节点值。
    /**
    * Definition for a binary tree node.
    * class TreeNode {
    * val: number
    * left: TreeNode | null
    * right: TreeNode | null
    * constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
    * this.val = (val===undefined ? 0 : val)
    * this.left = (left===undefined ? null : left)
    * this.right = (right===undefined ? null : right)
    * }
    * }
    */

    function kthSmallest(root: TreeNode | null, k: number): number {
    let ans = -Infinity;

    function dfs(node: TreeNode | null) {
    if (!node) {
    return;
    }

    dfs(node.left);

    if (k > 0) {
    ans = Math.max(ans, node.val);
    k--;
    }

    dfs(node.right);
    }

    dfs(root);

    return ans;
    };