LeetCode 算法:二叉搜索树中第K小的元素 c++

原题链接🔗:二叉搜索树中第K小的元素
难度:中等⭐️⭐️

题目

给定一个二叉搜索树的根节点 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 小的值,你将如何优化算法?

题解

二叉搜索树

二叉搜索树(Binary Search Tree,简称BST)是一种特殊的二叉树,它具有以下性质:

  1. 有序性:对于树中的每个节点,其左子树上所有节点的值都小于该节点的值,其右子树上所有节点的值都大于或等于该节点的值。

  2. 没有兄弟节点:每个节点最多只有一个左子节点和一个右子节点。

  3. 每个节点存储一个键值:在二叉搜索树中,每个节点通常存储一个键值,该键值用于维护树的有序性。

  4. 树结构:二叉搜索树是树结构,这意味着它是一个没有环的分层数据结构。

  5. 平衡性:理想情况下,二叉搜索树是平衡的,即左右子树的高度差不超过1。平衡的二叉搜索树可以保证操作(如搜索、插入和删除)的时间复杂度为O(log n)。但在最坏的情况下,如果插入的元素是有序的,树将退化成链表,时间复杂度变为O(n)。

二叉搜索树的应用非常广泛,因为它提供了高效的数据存储和检索方式。以下是一些基本操作:

  • 搜索:在BST中搜索一个元素,可以从头节点开始,根据目标值与当前节点值的比较结果,决定是向左子树还是向右子树搜索。这个过程可以递归或迭代进行,直到找到目标值或到达叶子节点。

  • 插入:向BST中插入一个新元素,首先搜索该元素应该插入的位置,然后根据BST的性质将其插入到适当的位置。

  • 删除:从BST中删除一个元素,需要考虑几种情况:删除的节点没有子节点、有一个子节点或有两个子节点。在删除节点后,需要调整树以保持BST的性质。

  • 遍历:BST可以通过前序、中序、后序和层序遍历来访问所有节点。中序遍历特别有用,因为它将按照升序访问所有节点。

二叉搜索树的实现通常涉及到递归和迭代技术,以及对树结构的深入理解。在实际应用中,为了提高性能,可能会使用自平衡的二叉搜索树,如AVL树或红黑树。

中序遍历

二叉树的中序遍历是一种遍历二叉树的方法,其遍历顺序为:先遍历左子树,然后访问根节点,最后遍历右子树。这种遍历方式可以确保在访问任何节点之前,其所有左子节点已经被访问过,同样地,在访问任何节点之后,其所有右子节点也会被访问。

中序遍历对于二叉搜索树(BST)特别有用,因为它会按照节点值的非递减顺序访问所有节点,即中序遍历的结果是一个有序数组。

以下是中序遍历的基本步骤:

  1. 访问左子树:首先,递归地对左子树进行中序遍历。

  2. 访问根节点:然后,访问根节点。在遍历过程中,通常会将根节点的值添加到一个列表中。

  3. 访问右子树:最后,递归地对右子树进行中序遍历。

中序遍历的时间复杂度为O(n),其中n是树中节点的数量,因为它需要访问树中的每个节点。空间复杂度取决于递归调用的深度,最坏情况下是O(n)(当树退化成链表时),最好情况下是O(log
n)(当树是平衡的)。

中序遍历递归法

  1. 解题思路

在LeetCode上,题目“二叉搜索树中第K小的元素”通常要求你找到一个二叉搜索树(BST)中第K小的元素。二叉搜索树的性质是:对于树中的任何节点,其左子树上的所有节点的值都小于该节点的值,其右子树上的所有节点的值都大于该节点的值。

解题思路如下:

  • 理解BST的性质:首先,要利用BST的性质来简化问题。在BST中,中序遍历(左-根-右)会以递增的顺序访问所有节点。

  • 中序遍历:由于题目要求找到第K小的元素,我们可以通过中序遍历BST来实现。在遍历过程中,记录访问的节点数量。

  • 计数与停止:在中序遍历的过程中,当访问到第K个节点时,停止遍历。这个节点就是所求的第K小的元素。

  • 递归或迭代:中序遍历可以通过递归或迭代的方式实现。递归是更直观的方法,但迭代可以避免潜在的递归深度问题。

  • 实现算法:编写代码实现上述逻辑。

  1. c++ demo
#include <iostream>
#include <vector>// 定义二叉树的节点结构
struct TreeNode {int val;TreeNode* left;TreeNode* right;TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};class Solution {
public:// 主函数,接收二叉搜索树的根节点和K值,返回第K小的元素int kthSmallest(TreeNode* root, int k) {std::vector<int> elements;inOrderTraversal(root, elements, k);return elements[k - 1]; // 由于数组索引从0开始,所以用k-1}private:// 中序遍历辅助函数,同时接收一个vector来存储遍历结果void inOrderTraversal(TreeNode* node, std::vector<int>& elements, int k) {if (!node || elements.size() >= k) {return;}// 遍历左子树inOrderTraversal(node->left, elements, k);// 访问当前节点if (elements.size() < k) {elements.push_back(node->val);}// 遍历右子树inOrderTraversal(node->right, elements, k);}
};// 示例使用
int main() {// 构建一个示例二叉搜索树//       3//      / \//     1   4//      \//       2TreeNode* root = new TreeNode(3);root->left = new TreeNode(1);root->right = new TreeNode(4);root->left->right = new TreeNode(2);Solution solution;int k = 3; // 假设我们要找第3小的元素std::cout << "The " << k << "st smallest element is: " << solution.kthSmallest(root, k) << std::endl;// 清理分配的内存(在实际应用中应该使用智能指针来自动管理内存)delete root->left->right;delete root->left;delete root->right;delete root;return 0;
}
  • 输出结果:

The 3st smallest element is: 3

  1. 代码仓库地址:kthSmallest

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

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

相关文章

网络爬虫之什么是代码混淆?初步理解代码混淆

爬虫逆向之什么是代码混淆&#xff1f;初步理解代码混淆 在网络爬虫和逆向工程的过程中&#xff0c;代码混淆是一项常见的技术&#xff0c;旨在保护代码不被轻易理解和逆向。对于爬虫工程师来说&#xff0c;理解并破解代码混淆是一个重要的技能。本文将详细介绍代码混淆的基本概…

GUI开发

Question One Java 实现动作监听&#xff0c;网格布局添加四个按钮&#xff0c;实现四个不同的文本显示 import java.awt.*; import java.awt.event.*; import javax.swing.*;class myGUI extends JFrame implements ActionListener{private Button b1, b2, b3, b4;private Tex…

0627,0628,0629,排序,文件

01&#xff1a;请实现选择排序&#xff0c;并分析它的时间复杂度&#xff0c;空间复杂度和稳定性 void selection_sort(int arr[], int n); 解答&#xff1a; 稳定性&#xff1a;稳定&#xff0c; 不稳定的&#xff0c;会发生长距离的交换 4 9 9 4 1 &#xf…

ubuntu,linux下屏蔽坏块方法-240625-240702封存

在windows下的屏蔽坏道的方法 机械硬盘坏道的文件系统级别的屏蔽方法_硬盘如何屏蔽坏扇区-CSDN博客 https://blog.csdn.net/cyuyan112233/article/details/139408503?spm1001.2014.3001.5502 【免费】磁盘坏道屏蔽工具磁盘坏道屏蔽工具_机械硬盘屏蔽坏扇区资源-CSDN文库 https…

第一周题目总结

1.车尔尼有一个数组 nums &#xff0c;它只包含 正 整数&#xff0c;所有正整数的数位长度都 相同 。 两个整数的 数位不同 指的是两个整数 相同 位置上不同数字的数目。 请车尔尼返回 nums 中 所有 整数对里&#xff0c;数位不同之和。 示例 1&#xff1a; 输入&#xff1a…

【嵌入式DIY实例-ESP8266篇】-LCD ST7735显示网络时间

LCD ST7735显示网络时间 文章目录 LCD ST7735显示网络时间1、硬件准备2、代码实现本文将介绍如何使用 ESP8266 NodeMCU Wi-Fi 板实现互联网时钟,其中时间和日期显示在 ST7735 TFT 显示屏上。 ST7735 TFT是一款分辨率为128160像素的彩色显示屏,采用SPI协议与主控设备通信。 1…

Python中的变量和数据类型:Python中有哪些基本数据类型以及变量是如何声明的

在Python中&#xff0c;变量是用来存储数据的容器&#xff0c;而数据类型则定义了这些数据的种类。Python是一种动态类型语言&#xff0c;这意味着你不需要在声明变量时指定其类型&#xff1b;Python解释器会在运行时自动确定变量的类型。 Python中的基本数据类型 Python中有…

SQL语句(DML)

DML英文全称是Data Manipulation Language&#xff08;数据操作语言&#xff09;&#xff0c;用来对数据库中表的数据记录进行增删改等操作 DML-添加数据 insert into employee(id, workno, name, gender, age, idcard) values (1,1,Itcast,男,10,123456789012345678);select *…

AI 与数据的智能融合丨大模型时代下的存储系统

WOT 全球技术创新大会2024北京站于 6 月 22 日圆满落幕。本届大会以“智启新纪&#xff0c;慧创万物”为主题&#xff0c;邀请到 60 位不同行业的专家&#xff0c;聚焦 AIGC、领导力、研发效能、架构演进、大数据等热门技术话题进行分享。 近年来&#xff0c;数据和人工智能已…

记录搭建一台可域名访问的HTTPS服务器

一、背景 近期公司业务涉及到微信小程序&#xff0c;即将开发完成需要按照微信小程序平台的要求提供带证书的域名请求服务器。 资源背景介绍如下&#xff1a; 1、域名 公司已有一个二级域名&#xff0c;再次申请新的二级域名并且实现ICP备案不仅需要花重金重新购买&#xff0c;…

Docker实现Redis主从,以及哨兵机制

Docker实现Redis主从,以及哨兵机制 目录 Docker实现Redis主从,以及哨兵机制准备Redis镜像创建Redis主节点配置文件启动Redis从节点确认主从连接哨兵主要功能配置哨兵文件创建Redis哨兵的Docker容器 要通过Docker实现Redis的主从&#xff08;master-slave&#xff09;复制&#…

汽车EDI: BMW EDI项目案例

宝马集团是全世界成功的汽车和摩托车制造商之一&#xff0c;旗下拥有BMW、MINI和Rolls-Royce三大品牌&#xff1b;同时提供汽车金融和高档出行服务。作为一家全球性公司&#xff0c;宝马集团在14个国家拥有31家生产和组装厂&#xff0c;销售网络遍及140多个国家和地区。 本文主…

什么是 Socks5 代理?了解和使用 SOCKS5 代理的终极指南

SOCKS5是什么以及它如何工作&#xff1f; 在网络和互联网协议领域&#xff0c;有多种工具和技术在确保安全高效的通信方面发挥着至关重要的作用。 SOCKS5 就是这样一个工具&#xff0c;它代表套接字安全版本 5。 在这篇博文中&#xff0c;我们将深入探讨 SOCKS5 的细节&…

CoAtNet(NeurIPS 2023, Google)论文解读

paper&#xff1a;CoAtNet: Marrying Convolution and Attention for All Data Sizes third-party implementation&#xff1a;https://github.com/huggingface/pytorch-image-models/blob/main/timm/models/maxxvit.py 背景 自AlexNet以来&#xff0c;ConvNets一直是计算机…

【基于R语言群体遗传学】-5-扩展到两个以上等位基因及多基因位点

我们现在继续对于群体遗传学进行统计建模&#xff0c;书接上回&#xff0c;我们讨论了孤雌生殖的物种违反哈代温伯格遗传比例的例子&#xff0c;那我们现在来看多于两个等位基因的情况的计算。 如果没有看过之前文章的同学&#xff0c;可以先去看一下之前的文章&#xff1a; …

开源租房项目

项目名称项目地址描述体验地址后端代码前端代码小程序端代码gitHubstart租房或房屋交易项目https://github.com/saysky/manland?tabreadme-ov-filePC端 管理端http://manland.liuyanzhao.com/有有无房适–房屋租赁管理平台https://github.com/LiuXIn011/rightHouse开源房屋管理…

非对称加密算法原理与应用1——秘钥的生成

作者:私语茶馆 1.前言 非对称算法有非常多的用途,实现license管控,数字签名,加密内容等等,由于涉及场景和标准非常多,因此实际使用过程中还是存在一定门槛,这里记录一下利用非对称算法RSA的应用关键点,并提供实现license管理的案例。预计拆分为以下几个章节: (1)秘…

Apipost接口测试工具的原理及应用详解(三)

本系列文章简介: 随着软件行业的快速发展,API(应用程序编程接口)作为不同软件组件之间通信的桥梁,其重要性日益凸显。API的质量直接关系到软件系统的稳定性、性能和用户体验。因此,对API进行严格的测试成为软件开发过程中不可或缺的一环。在众多API测试工具中,Apipost凭…

【分布式数据仓库Hive】HivQL的使用

目录 一、Hive的基本操作 1. 使用Hive创建数据库test 2. 检索数据库&#xff08;模糊查看&#xff09;&#xff0c;检索形如’te*’的数据库 3. 查看数据库test详情 4. 删除数据库test 5. 创建一个学生数据库Stus&#xff0c;在其中创建一个内部表Student&#xff0c;表格…

ubuntu20.04在anaconda环境下不能使用catkin_make

ubuntu20.04在anaconda环境下不能直接使用catkin_make编译&#xff0c;报错显示需要安装python3-empy 这时候查询会发现该软件包已经安装了&#xff0c;但是是在ROS环境中&#xff0c;安装anaconda环境后python解释器的指向变了&#xff0c;所以需要在anaconda环境中再装pytho…