每日一练:二叉搜索树中第K小的元素

news2024/9/28 15:29:16

230. 二叉搜索树中第 K 小的元素 - 力扣(LeetCode)

一、题目要求

给定一个二叉搜索树的根节点 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 <= 104
  • 0 <= Node.val <= 104

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

二、解法1-通用做法 O(N)

        解法1对任意一颗二叉树都能找到第K小的元素,不论是否是二叉搜索树。

class Solution {
public:
    int kthSmallest(TreeNode* root, int k) {
        if(root == nullptr || k < 0) // 安全检查
            return -1;
        map<int,int> map;
        queue<TreeNode*> queue;
        queue.push(root);
        while(!queue.empty())
        {
            root = queue.front();
            map[root->val]++;
            if(root->left)
                queue.push(root->left);
            if(root->right)
                queue.push(root->right);
            queue.pop();
        }
        for(const auto& it:map)
        {
            k-=it.second;
            if(k <= 0)
                return it.first;
        }
        return -1; // k比节点数还大,则不存在
    }
};

         优化1:

        二叉搜索树的一个特征是没有重复的元素,我们可以利用这个特点,把所有的节点值插入一个数组容器中,排序后下标为k-1的元素就是第k小的元素。

class Solution {
public:
    int kthSmallest(TreeNode* root, int k) {
        if(root == nullptr || k < 0) // 安全检查
            return -1;
        vector<int> v;
        queue<TreeNode*> queue;
        queue.push(root);
        while(!queue.empty())
        {
            root = queue.front();
            v.push_back(root->val);
            if(root->left)
                queue.push(root->left);
            if(root->right)
                queue.push(root->right);
            queue.pop();
        } 
        sort(v.begin(),v.end());      
        return v[k-1];
    }
};

        优化2:

        二叉搜索树最重要的特性是左子树的所有节点比根小,右子树的所有节点比根大,那么它的中序遍历一定是一个升序的序列,就不需要额外排序了,将上述的插入顺序改为中序遍历。

class Solution {
public:
    int kthSmallest(TreeNode* root, int k) {
        if (root == nullptr || k < 0) // 安全检查
            return -1;
        stack<TreeNode*> stack;
        int ret;
        for(int i = 1;i <= k;i++) { // 只需要得到第k个即可
            while (root) {
                stack.push(root);
                root = root->left;
            }
            root = stack.top()->right;
            ret = stack.top()->val;
            stack.pop();
        }
        return ret;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2168552.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

配置anaconda环境变量的影响

配置anaconda环境变量的影响 配置虚拟机的过程&#xff1a;拉取一个配置为pytorch1.12.0-python3.7的docker镜像&#xff0c;创建虚拟机。创建好了之后验证了torch可以调用GPU。之后安装anaconda&#xff0c;并配置/root/anaconda的环境变量&#xff0c;之后创建虚拟环境wyq。…

性能优化与资源管理:优化Selenium脚本的执行效率,合理管理浏览器实例和系统资源

目录 引言 一、Selenium基础与常用方法 1.1 Selenium简介 1.2 Selenium基础用法 二、Selenium性能优化技巧 2.1 使用WebDriverWait实现显式等待 2.2 启用无头模式 2.3 设置合理的页面加载策略 2.4 禁用图片和JavaScript加载 2.5 优化元素定位 2.6 合理使用隐式等待和…

《经典图论算法》约翰逊算法(Johnson)

摘要&#xff1a; 1&#xff0c;约翰逊算法的介绍 2&#xff0c;约翰逊算法的实现步骤 3&#xff0c;约翰逊算法的准确性验证 4&#xff0c;约翰逊算法的代码实现 1&#xff0c;约翰逊算法的介绍 约翰逊算法(Johnson algorithm)是在稀疏图上求每对顶点之间最短路径的一种算法&a…

EchartJs报表展示

EchartJs报表展示 1、Echarts介绍 我们当前项目下的图形报表是使用echarts实现&#xff0c;所以接下来我们学习下echart的基本使用。 echarts Apache官网&#xff1a;https://echarts.apache.org/zh/index.html 点击所有示例&#xff0c;可快速学习echarts的基本使用&#x…

2024 大厂 Java 面试题汇总,作为 Java 程序员必须要掌握的技术栈

面试就是大家身边总是存在各种各样的可能,而自身又具备这样的能力,就忍不住想试一试&#xff0c;尤其是到了年关&#xff0c;是一个好的蓄势并且认真积累的阶段。当然面试套路众多&#xff0c;但对于技术面试来说&#xff0c;主要是考察一个人的技术能力和沟通能力。不同类型的…

一文了解智能无感知验证码

在数字化浪潮中&#xff0c;验证码作为守护信息安全的第一道关卡&#xff0c;其重要性日益凸显。它不仅用于识别真实用户与机器程序&#xff0c;更是防范网络攻击、保障数据安全的关键手段。本文将深入探讨验证码的定义、作用、分类&#xff0c;并重点介绍智能无感知验证码这一…

常用并发设计模式精讲

1. 优雅终止线程的设计模式 思考&#xff1a;在一个线程 T1 中如何优雅的终止线程 T2&#xff1f; 正确思路&#xff1a;两阶段终止模式 1.1 两阶段终止&#xff08;Two-phase Termination&#xff09;模式——优雅的终止线程 两阶段终止&#xff08;Two-phase Termination…

数据结构升华部分:排序与字符串匹配算法应用

数据结构入门学习&#xff08;全是干货&#xff09;——综合应用 习题选讲 - 排序与字符串匹配算法 习题选讲 - Insert or Merge 习题-IOM.1 插入排序的判断 题意理解 如何区分简单插入和非递归的归并排序 插入排序&#xff1a;前面有序&#xff0c;后面没有变化。归并排…

JUC高并发编程3:线程间通信

1 线程间通信 线程间通信的模型有两种&#xff1a;共享内存和消息传递&#xff0c;以下方式都是基本这两种模型来实现的。我们来基本一道面试常见的题目来分析 场景&#xff1a;两个线程&#xff0c;一个线程对当前数值加 1&#xff0c;另一个线程对当前数值减 1,要求用线程间…

【智能控制】第15章 智能优化算法,遗传算法

目录 15.1 遗传算法及其应用 15.1.1 遗传算法的基本原理 15.1.2 遗传算法的特点 15.1.3 遗传算法的应用领域 遗传算法的应用 15.1.4 遗传算法的设计 遗传算法的应用步骤 15.1.5 遗传算法求函数极大值 随着优化理论的发展&#xff0c;一些新的智能算法得到了迅速发…

深度学习:ResNet残差神经网络

目录 一、什么是ResNet残差神经网络 二、残差结构 三、18层残差网络 1.最初残差网络变体 2.图片示例 3.表格示例 四、批次归一化&#xff08;Batch Normalization&#xff09; 1.工作过程 2.主要作用 五、ResNet残差神经网络解决了传统神经网络什么问题 1.梯度消失和…

node-red-L3-重启指定端口的 node-red

重启指定端口 目的步骤查找正在运行的Node.js服务的进程ID&#xff08;PID&#xff09;&#xff1a;停止Node.js服务&#xff1a;启动Node.js服务&#xff1a; 目的 重启指定端口的 node-red 步骤 在Linux系统中&#xff0c;如果你想要重启一个正在运行的Node.js服务&#x…

【AI绘画】Midjourney进阶:光影控制详解

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AI绘画 | Midjourney 文章目录 &#x1f4af;前言&#x1f4af;为什么要学习光影控制光影控制的作用 &#x1f4af;强化主题hard lighting&#xff08;硬光 &#xff09;soft lighting&#xff08;软光/柔光&#xff09;测试 &…

利用Puppeteer-Har记录与分析网页抓取中的性能数据

引言 在现代网页抓取中&#xff0c;性能数据的记录与分析是优化抓取效率和质量的重要环节。本文将介绍如何利用Puppeteer-Har工具记录与分析网页抓取中的性能数据&#xff0c;并通过实例展示如何实现这一过程。 Puppeteer-Har简介 Puppeteer是一个Node.js库&#xff0c;提供…

Leetcode面试经典150题-322.零钱兑换

给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1 。 你可以认为每种硬币的数量是无限的。 示…

[数据库实验一]数据库和表

目录 一、实验目的与要求 二、实验内容 实验小结 一、实验目的与要求 1.掌握MySQL中如何创建数据库和表的方法 2.熟练掌握MySQL的数据类型、主键实体完整性的设置 3.参照完整性的定义及应用 4.插入数据 5.数据库的备份操作 二、实验内容 &#xff11;、创建名为fruit…

CleanMyMac X 评价、介绍、使用教学|Mac系统最推荐的系统优化和清理软件工具!

本篇文章要带大家看一款知名的Mac系统优化、清理工具– CleanMyMac X &#xff0c;并且也会附上详细的介绍和使用教学。 链接: https://pan.baidu.com/s/1_TFnrIVH1NGsZPsA3lpwAA 提取码: dpjw CleanMyMac X-安装包&#xff1a;https://souurl.cn/QUYb57 为什么Mac电脑需要装系…

Cilium + ebpf 系列文章-什么是ebpf?(一)

前言&#xff1a; 这篇非常非常干&#xff0c;很有可能读不懂。 这里非常非常推荐&#xff0c;建议使用Cilium官网的lab来辅助学习&#xff01;&#xff01;&#xff01;Resources Library - IsovalentExplore Isovalents Resource Library, your one-stop destination for ins…

FocSAM

Dynamic Window简写为Dwin 辅助信息 不建议复现

TCN-Transformer+GRU多变量时间序列预测(Matlab)

超强来袭&#xff01;双路创新&#xff01;TCN-TransformerGRU多变量时间序列预测&#xff08;Matlab&#xff09; 目录 超强来袭&#xff01;双路创新&#xff01;TCN-TransformerGRU多变量时间序列预测&#xff08;Matlab&#xff09;效果一览基本介绍程序设计参考资料 效果一…