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

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

题目描述

一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。

说明:

你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。

示例 1:

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

示例 2:

输入: root = [5,3,6,2,4,null,null,1], k = 3
    5
    / \
    3   6
    / \
2   4
/
1
输出: 3

进阶:

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

思路

思路1 中序遍历+剪枝+递归

直接递归使用中序遍历,然后通过设置一个计数器计算数在整个二叉搜索中排序的位置,到达第K小时返回结果(超过K直接返回)

思路2 中序遍历+剪枝+迭代

使用一个栈实现中序遍历迭代,通过出栈的数量找到第K个数

代码

代码1

class Solution {
    int numCount;
    int result;
    
    public int kthSmallest(TreeNode root, int k) {
        numCount = 0;
        addSearchNum(root, k);
        return result;
    }
    
    private void addSearchNum(TreeNode root, int k){
        if (root == null || numCount > k){
            return;
        }
        addSearchNum(root.left, k);
        numCount ++;
        if (numCount == k){
            result = root.val;
        }
        addSearchNum(root.right, k);
    }
}

代码2

class Solution {
    public int kthSmallest(TreeNode root, int k) {
        Stack stack = new Stack<>();
        while(true){
            while (root != null){
                stack.push(root);
                root = root.left;
            }
            root = stack.pop();
            k --;
            if (k == 0) return root.val;
            root = root.right;
        }
    }
}

复杂度分析

思路1时间复杂度

$O(N)$需要考虑为所有节点都在左子树

思路1空间复杂度

$O(N)$可能会有左子树,会有栈的深度

思路2时间复杂度

$O(N)$

思路2空间复杂度

$O(N)$


文章作者: 小风雷
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小风雷 !
评论
 上一篇
Leetcode:236. 二叉树的最近公共祖先 Leetcode:236. 二叉树的最近公共祖先
Leetcode: 236. 二叉树的最近公共祖先题目描述给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q
2020-04-11
下一篇 
Leetcode:380. 常数时间插入、删除和获取随机元素 Leetcode:380. 常数时间插入、删除和获取随机元素
Leetcode: 380. 常数时间插入、删除和获取随机元素题目描述设计一个支持在平均 时间复杂度 O(1) 下,执行以下操作的数据结构。 insert(val):当元素 val 不存在时,向集合中插入该项。 remove(val):元
2020-04-09
  目录