前端算法-二叉搜索树中第K小的元素

93 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第32天,点击查看活动详情

题目

给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。

输入: root = [3,1,4,null,2], k = 1
输出: 1

思路一

我们先判断一下当前root形参是否为空,如果为空则直接返回null,接下来在声明一个stack空数组和res空数组,用来存放每次要访问的子节点树,在声明一个p变量用于迭代,他的值是root形参,然后我们使用循环,循环条件为,当前stack数组长度不为0且p存在,然后循环中在写一个循环,在第二层循环中不停将p指向当前节点的左子树,然后推入调用栈,循环完成之后在将stack删除末位置,并用n常量存储起来删除的值,然后把n变量的val值使用push方法添加到res数组中,在将p变量指向n的右子节点树,最后将res数组的形参k-1位置的值返回出去即可

var kthSmallest = function(root, k) {
    if(!root) return null;
    let stack = [], res = []
    let p = root
    while(stack.length || p) {
       while(p) {
           stack.push(p)
           p = p.left
       }
       const n = stack.pop() 
       res.push(n.val)
       p = n.right
     }
    return res[k-1]
}

思路二

我们都知道二叉搜索树的节点都是有顺序的,所以我们这里可以使用递归进行实现,在二叉搜索树中它的任意节点也包括根节点的左子树上的节点的值都比这个节点得值小,它的右子树上的节点的值都比这个节点得值大,那么我们可以使用中序遍历,在中序遍历过后,这个节点就会从小到大进行排列,到时候我们只需要将中序遍历后的数组中的第k-1个数值返回出去即可

var kthSmallest = function(root, k) {
    const res = []
    var inOrder = (root) => {
        if(!root) return
        inOrder(root.left)
        res.push(root.val)
        inOrder(root.right)
    }
    inOrder(root)
    return res[k-1]
};