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

这篇博客介绍了如何利用二叉搜索树的性质,结合栈的数据结构,有效地找到树中第k个最小元素。算法首先遍历左子树,然后检查当前节点,如果k等于0则找到目标,否则根据k与左子树节点数量的关系决定继续在右子树中搜索。时间复杂度在平衡树情况下为O(logN+k),最坏情况下为O(N+k),空间复杂度在最坏情况下为O(N)。
摘要由CSDN通过智能技术生成

题目描述

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

涉及tag

二叉树

算法思路

二叉搜索树的性质:左子树节点value小于根节点value,右子树节点valu大于根节点value。
结合栈这个数据结构,通过入栈和出栈的顺序从最小到最大返回节点的value。
结合第94题,当k等于0的时候说明已经遍历到第k小的元素。见示例代码1。为避免每一个都遍历,可以比较k和左子树包含元素的大小,讨论:
情况1:k =左子树的节点个数,返回左子树的根节点。
情况2:k > 左子树的节点个数,说明第k小的元素一定在右子树中。将右子树的节点作为根节点,将k重置为k - num(left) - 1,递归进行比较,直到确认在左子树中,根据算法一找到该元素。
情况3:k < 左子树的节点个数,说明第k小的元素一定在左子树中,根据算法一找到该元素。

示例代码

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

时间复杂度:
O(H+k),其中 H 是树的高度。在开始遍历之前,需要 O(H)到达叶结点。
当树是平衡树时,时间复杂度取得最小值 O(log N + k);当树是线性树(树中每个结点都只有一个子结点或没有子结点)时,时间复杂度取得最大值 O(N+k)。
空间复杂度:O(H),栈中最多需要存储 H 个元素。当树是平衡树时,空间复杂度取得最小值 O(logN);当树是线性树时,空间复杂度取得最大值 O(N)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值