给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 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个小的元素就是,“升序遍历”的第k个位置的值

/**
 * 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 count = 0
    let result = 0

    const inorder = (node:TreeNode | null ):void =>{
        if(!node || count>k) return
        inorder(node.left)
        count++
        if(count===k){
            result = node.val
            return
        }
        inorder(node.right)
    }

    inorder(root)
    return result
};
/**
 * 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 {
    //count是计数器,指遍历到了哪一位
    let count = 0
    //result存放符合条件的val值
    let result = 0

    const inorder = (node:TreeNode | null ):void =>{
        if(!node || count>k) return
        inorder(node.left)
        count++
        if(count===k){
            result = node.val
            return
        }
        inorder(node.right)
    }

    inorder(root)
    return result
};

共勉

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐