c++实现二叉搜索树(上)

 宝贝们,好久不见,甚是想念🤗小吉断更了差多有10多天,在断更的日子里,小吉也有在好好学习数据结构与算法,但是学的并不多而且学的并不是很认真。主要是中途笔记本屏出现问题了(这件事有点让小吉我没法好好沉下心来学习,而且不用电脑学起来有点费劲,不能边学边敲代码😖),换了个屏,小吉我现在是满血复活(啊哈哈哈),现在的我是看着新屏幕在写blog(着实很开兴🎉🎉🎉)
 没想到,小吉我又讲了这么多的废话(太激动了,实在是抱歉~),从这里开始就要进入我们今天的学习了(前面的废话大家可以不看,但从这开始就要好好看了哦)。
 今天我们要学习一种基础算法,也就是二叉搜索树,老规矩,在实现二叉搜索树之前,我们先来了解了解二叉搜索树是什么。

二叉搜索树的定义

二叉搜索树
1.树节点增加key属性,用来比较谁大谁小,key不可以重复
2.对于任意一个节点,它的key比左子树的key都大,同时也比右子树的key都小

善解人意的小吉猜很多小可爱们看到这些概念都很难一下子就理解了,接下来小吉画一张图,方便大家理解(比起上面👆的概念,小吉认为下面的图比较重要)
二叉搜索树
注:标的数值都是键值
最后,小吉来考考你们🧐,看看你们是否是真的了解了二叉搜索树,上图👆键值6的右子树的取值范围
(>6&&<7这个是答案哦~)

二叉搜索树的时间复杂度
(平均时间复杂度)O(logn) 对数时间
(最坏情况时间复杂度)O(n) 线性时间

(小吉不禁想到二分查找了,感觉二叉搜索树和二分查找有点莫名的相似,小吉我有出过和二分查找相关的博客,但没有总结过二分查找的知识点,看小可爱们的反馈吧,有需要小吉再出❤️)

二叉搜索树的实现大纲

get——查找键值对应的实值
min——查找最小键值对应的实值
max——查找最大键值对应的实值
put——存储键值和实值
successor——查找键值的前任(即前继节点)
predecessor——查找键值的后任(即后继节点)
deletednode——根据键值删除
范围查询:
myless——找<key的所有实值
mygreater——找>key的所有实值
mybetween——找>=key1且<=key2的所有实值

搭建基本框架

 二叉搜索树节点类(不同之处:小吉我设置的节点有键值(起索引作用)和实值,所有元素都会根据元素的键值自动排序)

class BSTnode
{
public://初始化列表BSTnode(int key,string value):_key(key),_value(value),_left(nullptr),_right(nullptr) {}
public:int _key;//键值string _value;//实值BSTnode* _left;BSTnode* _right;
};

实现二叉搜索树方法的类

class BSTTree
{
public:BSTTree(BSTnode* root):_root(root) { }
public:BSTnode* _root;//根节点
};

创建二叉搜索树(方便后期测试)

BSTnode* buildTree()
{//创建根节点BSTnode* root = new BSTnode(4, "庄周");//创建左子树root->_left = new BSTnode(2, "东皇太一");root->_left->_left = new BSTnode(1, "小乔");root->_left->_right = new BSTnode(3, "大乔");//创建右子树root->_right = new BSTnode(6, "兰陵王");root->_right->_left = new BSTnode(5, "王昭君");root->_right->_right = new BSTnode(7, "百里守约");return root;
}

树

get——查找键值对应的实值

有两种实现方式,递归和非递归

思路:比较键值,以根节点为例,要找的键值比根节点的键值大,往右找;要找的键值比根节点的键值小,往左找;若相等,返回该节点的实值

递归实现,先实现一个递归查找的方法,再用get进行调用

string BSTTree::doGet(BSTnode* node, int key)
{if (node == nullptr){return "没找到";//没找到}if (node->_key<key){return doGet(node->_right, key);}else if (node->_key>key){return doGet(node->_left, key);}else{return node->_value;}
}
string BSTTree:: get(int key)//查找键值对应的实值{return doGet(_root, key);}

非递归实现

string BSTTree::get2(int key)
{BSTnode* node = _root;while (node != nullptr){if (node->_key > key){node = node->_left;}else if (node->_key < key){node = node->_right;}else{return node->_value;}}return "没找到";
}

min——查找最小键值对应的实值

思路:二叉搜索树的定义是对于一个任意节点它的左子树的一定比它小(针对键值_key而言),所以查找最小键值就要一直往左找,直到左子树为空,往左找可以分为递归和非递归两种方式

递归实现

string BSTTree::doMin(BSTnode* node)
{if (node == nullptr){return "二叉树中没有节点";}if (node->_left == nullptr){return node->_value;}return doMin(node->_left);
}
string BSTTree::min()//查找最小键值对应的实值{return doMin(_root);}

非递归实现

string BSTTree::min2()
{if (_root == nullptr){return "二叉树没有节点";}BSTnode* node = _root;while (node->_left != nullptr){node = node->_left;}return node->_value;
}

max——查找最大键值对应的实值

思路:和查找最小键值对应的实值思路差不多,要一直往右找,直到右子树为空

这里就只提供一种实现方式:非递归实现

string BSTTree::max()
{if (_root == nullptr){return "二叉树中没有节点";}BSTnode* p = _root;while (p->_right != nullptr){p = p->_right;}return p->_value;
}

put——存储键值和对应的实值

思路:分为两种情况,1)当提供的键值在树中存在,只用更新节点的实值即可 2)键值在树中不存在,就要新增节点(建立新的父子关系)
 遍历二叉搜索树,查找键值是否存在,并在查找的过程中用指针记录父节点,找到直接更新即可;没找到新增节点,并建立父子关系

代码实现

void BSTTree::put(int key, string value)
{BSTnode* node = _root;BSTnode* parent = nullptr;while (node != nullptr){parent = node;if (node->_key < key){node = node->_right;}else if (node->_key > key){node = node->_left;}else{//key找到了,更新node->_value = value;return;}}//二叉树一开始就没有节点if (parent == nullptr){_root = new BSTnode(key, value);return;}//key没有找到,新增if (parent->_key > key)//parent为新增节点的父节点{parent->_left = new BSTnode(key, value);}else{parent->_right = new BSTnode(key, value);}
}

 小吉的这篇blog就先讲到这了,二叉搜索树还没有讲完,怕讲太多各位小伙伴们不能很好的吸收理解(其实一次性讲完小吉会很累的🤫)
 学习的时间总是短暂的,这篇博客到这里就结束了,下一篇blog我们接着唠,期待一下小吉的下一篇blog吧,在小吉没有更新的日子里,希望大家不要忘了小吉哦❤️,也别忘了好好学习数据结构和算法(共勉💪)

最后的最后,创作不易,还望各位baby们多多支持🌹🌹🌹
(如有错,还望各位大大们多多指导😘)

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

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

相关文章

函数递归(C语言)(详细过程!)

函数递归 一. 递归是什么1.1 递归的思想1.2 递归的限制条件 二. 递归举例2.1 求n的阶乘2.2 按顺序打印一个整数的每一位 三. 递归与迭代3.1 求第n个斐波那契数 一. 递归是什么 递归是学习C语言很重要的一个知识&#xff0c;递归就是函数自己调用自己&#xff0c;是一种解决问题…

2024年中国移动游戏市场研究报告

来源&#xff1a;点点数据&#xff1a; 近期历史回顾&#xff1a; 面向水泥行业的5G虚拟专网技术要求&#xff08;2024&#xff09;.pdf 2024年F5G-A绿色万兆全光园区白皮书.pdf 2024年全球废物管理展望报告.pdf 内容管理系统 2024-2025中国羊奶粉市场消费趋势洞察报告.pdf 20…

Web端在线Stomp服务测试与WebSocket服务测试

Stomp服务测试 支持连接、发送、订阅、接收&#xff0c;可设置请求头、自动重连 低配置云服务器&#xff0c;首次加载速度较慢&#xff0c;请耐心等候 预览页面&#xff1a;http://www.daelui.com/#/tigerlair/saas/preview/lxbho9lkzvgc 演练页面&#xff1a;http://www.da…

Django之云存储(一)

一、介绍 用户上传的文件以及项目中使用的静态文件,除了保存在本地服务器,还在可以保存在云服务中,比如: 阿里云七牛云(课程选用)亚马逊云等1.1、使用方式 注册账号 七牛云开发者平台 实名认证 创建空间

pycharm终端pip安装模块成功但还是显示找不到 ModuleNotFoundError: No module named

报错信息&#xff1a; ModuleNotFoundError: No module named 但是分明已经安装过此模块&#xff1a; 在cmd运行pip list 查看所有安装过的包找到了安装过&#xff1a; 如果重新安装就是这样&#xff1a;显示已经存在了 问题排查&#xff1a; 直接根据重新安装的显示已存在的…

Beego 使用教程 9:ORM 操作数据库(上)

beego 是一个用于Go编程语言的开源、高性能的 web 框架 beego 被用于在Go语言中企业应用程序的快速开发&#xff0c;包括RESTful API、web应用程序和后端服务。它的灵感来源于Tornado&#xff0c; Sinatra 和 Flask beego 官网&#xff1a;http://beego.gocn.vip/ 上面的 be…

pikachu靶场通关全流程

目录 暴力破解&#xff1a; 1.基于表单的暴力破解&#xff1a; 2.验证码绕过(on server)&#xff1a; 3.验证码绕过(on client)&#xff1a; token防爆破&#xff1a; XSS&#xff1a; 1.反射型xss(get)&#xff1a; 2.反射性xss(post)&#xff1a; 3.存储型xss&#…

2024中国网络安全产品用户调查报告(发布版)

自2020年始&#xff0c;人类进入了21世纪的第二个十年&#xff0c;全球进入了百年未有之大变局&#xff0c;新十年的开始即被新冠疫情逆转了全球化发展的历程&#xff0c;而至2022年3月俄乌战争又突然爆发&#xff0c;紧接着2023年7月“巴以冲突"皱起&#xff0c;世界快速…

7.Nginx动静分离

介绍 把动态和静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。 动静分离从目前实现角度分为两种: 1.纯粹把静态文件独立成单独的域名,放在独立的静态资源服务器上,目前主流推崇的方案。 2.动态和静态文件混合在一起发布,通过nginx来分开。 通过loc…

Flutter基础 -- Flutter常用组件

目录 1. 文本组件 Text 1.1 基础用法 1.2 Text 定义 1.3 Text 示例 1.4 Text.rich、RichText 、TextSpan 1.5 RichText 示例 2. 导入资源 2.1 加入资源 2.2 加入图片 3. 图片组件 image 3.1 colorBlendMode 混合参数 3.2 fit 图片大小适配 3.3 ImageProvider 图片…

Echarts 绘制自定义图形

文章目录 需求分析需求 在 Echarts 中绘制一个不规则图形放置在指定位置 分析 可以先从一个六边形画起 可以使用 ECharts 中的『自定义图形』来绘制一个封闭的六边形。以下是一个简单的示例代码,演示了如何使用 ECharts 绘制一个封闭的六边形: <!DOCTYPE html> &l…

《数据结构与算法之美》学习笔记二

前言&#xff1a;本篇文章介绍了一下二叉树中的基本知识点&#xff0c;包括二叉树的种类、二叉树的存储方式以及二叉树的深度和广度优先遍历&#xff1b;以及《数据结构与算法》中对于数组的讲解记录&#xff0c;只记录了本前端能看懂的&#x1f913;&#xff0c;还有很多知识点…

视频行人搜索 (Person Search in Videos)

文章目录 视频行人搜索 (Person Search in Videos)图像行人搜索存在问题Video PS 定义MTA-PS数据集First person search dataset in videosComplicated ambient conditions and realistic monitoring scenariosPrivacy insensitivity 方法 视频行人搜索 (Person Search in Vide…

FiRa标准UWB MAC实现(三)——距离如何获得?

继续前期FiRa MAC相关介绍,将FiRa UWB MAC层相关细节进一步进行剖析,介绍了UWB技术中最重要的一个点,高精度的距离是怎么获得的,具体使用的测距方法都有哪些,原理又是什么。为后续FiRa UWB MAC的实现进行铺垫。 3、测距方法 3.1 SS-TWR SS-TWR为Single-Sided Two-Way Ra…

ER实体关系图(一)

用户表(user)、用户钱包表(user_wallet)(与user是1对1关系)、用户钱包交易日志表(user_wallet_log)(与user是1对多关系) user&#xff1a;用户表通常包含用户的基本信息&#xff0c;例如用户ID&#xff08;主键&#xff09;、用户名、密码&#xff08;通常加密存储&#xff09;…

Windows远程桌面连接

试验&#xff1a;使用Oracle VM VirtualBox创建虚拟机与物理机进行远程桌面连接实验 1. 准备 使用VirtualBox创建一台win10虚拟机&#xff0c;并与本地物理机相互ping通。&#xff08;注意&#xff1a;如何存在ping不通&#xff0c;可以试一下关闭Windows的防火墙&#xff09;…

iLogtail 2.0 重大升级,端上支持 SPL

作者&#xff1a;太业 流式处理语言发展 早期流式处理概念&#xff1a; 20 世纪 70 年代&#xff0c;编程语言如 APL 提供了对数组的流式操作&#xff0c;这可以看作是流式处理语法的早期形式。管道&#xff08;Pipes&#xff09;概念在 UNIX 系统中的引进使得可以通过命令行将…

课时152:项目发布_手工发布_方案解读

1.2.1 方案解读 学习目标 这一节&#xff0c;我们从 基础知识、简单实践、小结 三个方面来学习 基础知识 案例需求 实现一套业务环境的项目发布流程&#xff0c;基本的网站架构效果如下&#xff1a;架构解读&#xff1a;负载均衡采用Nginx服务&#xff0c;基于请求内容进行…

孩子用的灯什么样的好?劣质LED台灯所带来的三大危害

随着科技设备不断的进步&#xff0c;护眼台灯已经逐渐成为了书房中不可或缺的一员。它以多功能的特性赢得了广大消费者的青睐。然而&#xff0c;市面上的护眼台灯质量良莠不齐&#xff0c;这使得消费者的选择变得更加困难。不良产品不仅可能带来安全隐患&#xff0c;甚至有潜在…

AI 大模型训练中,通常会采用哪些方法?(输入篇)

大家好 某种程度来说大模型训练的核心算法就是300到400行代码&#xff0c;如果真正理解了并不难。下面我将带大家分析常规大模型训练有几个阶段以及在训练中一般会用到哪些方法。 由上图可以看出&#xff0c;大模型训练主要有四个阶段&#xff1a;预训练、有监督微调、奖励建模…