C++ 浅谈之二叉搜索树

news2025/2/26 0:29:47

C++ 浅谈之二叉搜索树

HELLO,各位博友好,我是阿呆 🙈🙈🙈

这里是 C++ 浅谈系列,收录在专栏 C++ 语言中 😜😜😜

本系列阿呆将记录一些 C++ 语言重要的语法特性 🏃🏃🏃

OK,兄弟们,废话不多直接开冲 🌞🌞🌞


一 🏠 概述

树介绍

树是区别于线性表的一种数据结构,是结点的有限集合(磁盘文件系统,树结构)

对树的基本认知:

1、节点的度 :一个节点含有子树个数

2、叶节点 :度为 0 节点

3、分支节点 :度不为 0 节点

4、树的度 :树中最大节点的度

5、节点的层次 : 从根为第一层,子节点为第二层,类推


二叉树

结点有限集合,每个结点最多有两个子树

**满二叉树 **:每一层都是满的(最后一层全是叶节点)

**完全二叉树 **:前 k - 1 层满的,最后一层从左到右连续

针对于完全二叉树,有两种方式实现,数组和链表


二叉搜索树

具有三种性质 :① 若右子树不为空,那么右子树上所有结点大于根结点 ② 若左子树不为空,那么左子树上所有结点小于根结点 ③ 左右子树每个结点均满足上述条件

根据上述特性,下图即为二叉搜索树

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MUu3IC90-1676463465159)(E:\2022年MD文档\2023 年 MD文档\二月\浅谈系列\C++ 浅谈之二叉搜索树.assets\bbf5bbc83fae41bfabd64c404de72840.png)]

子树中一个不满足上述规则,就不是二叉搜索树

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yTilUI44-1676463465161)(E:\2022年MD文档\2023 年 MD文档\二月\浅谈系列\C++ 浅谈之二叉搜索树.assets\8b92f1ed9f5a4e9697dd8af807ea65cd.png)]

一个二叉树是否为搜索树,只需中序遍历,看数据是否从小到大排序即可

二叉搜索树效率为 O(logn) ,但对于单边树情况为 O(n),所以产生了 AVL 树 和 红黑树


二 🏠 核心

二叉搜索树实现

二叉搜索树节点

//与普通二叉树一致, 增加模板参数
template<class K>
struct BSTreeNode {
    BSTreeNode<K>* _left;
    BSTreeNode<K>* _right;
    K _key;

    BSTreeNode(const K& key)
        :_key(key)
            ,_left(nullptr)
            ,_right(nullptr)
        {}
};

二叉搜索树构造

只需存入二叉树根节点即可

template<class K>
class BSTree {
typedef BSTreeNode<K> Node;
public:
	BSTree() = default; //强制编译器生成默认构造函数
	Node* _root = nullptr; 
}

二叉搜索树查找

二叉搜索树有序,左树比根小,右树比根大

bool Find(const K& key) { //迭代版本
	Node* cur = _root;
	while (cur)	{
        //当前的key小于待查找的key,去当前节点的右子树查找
        if (cur->_key < key) cur = cur->_right;
        //当前的key大于待查找的key,去当前节点的左子树查找
        else if (cur->_key > key) cur = cur->_left;
        else return true;
    }    
    
	return false;
}

二叉搜索树插入

按照前面的规律遍历,只要走到空,该位置即为插入位置

bool Insert(const K& key) { //迭代版本
    //空树特殊处理
    if (_root == nullptr)  {  
        _root = new Node(key);
        return true;
    }

    //查找对应的插入位置
    Node* cur = _root;
    Node* parent = nullptr;
    //cur走到空开始插入
    while (cur) {
        if (cur->_key < key) { //走右子树
            parent = cur;
            cur = cur->_right;
        } else if (cur->_key > key) { //走左子树
            parent = cur;
            cur = cur->_left;
        } else {
            return false; //树中与插入节点相同值, 会终止插入
        }
    }
    
    cur = new Node(key);
    if (parent->_key < key) parent->_right = cur; //插入到右子树
    else parent->_left = cur;//插入到左子树

    return true;
}

二叉搜索树节点删除

首先查找元素是否在二叉搜索树中,如果不存在,则返回

否则要删除结点可能分下面四种情况

a、删除结点无孩子结点

b、删除结点只有左孩子结点

c、删除结点只有右孩子结点

d、删除结点有左、右孩子结点

情况 A 可与情况 B 或 C 合并,因此情况如下

情况 B :删除该结点且父结点指向该节点左孩子(直接删除)

情况 C :删除该结点且父结点指向该节点右孩子(直接删除)

情况 D :该节点右子树第一个结点,将值填补到被删除节点(替换法删除


二叉搜索树应用

K模型

只有 Key 作为关键码,(结构只需存储 Key,关键码即为需要搜索到的值)

比如 :随机生成一个 word,判断该 word 是否存在

单词集中每个单词作为 KEY,构建二叉搜索树并检索是否存在


KV 模型

每一个关键码 Key,都有与之对应的值 Value,即 <Key, Value> 键值对

比如英汉词典英文与中文的对应关系


二叉搜索树的性能,取决于树形状,若类似完全二叉树,则为 O(logn);对于单边树,效率退化为 O(n)


三 🏠 结语

身处于这个浮躁的社会,却有耐心看到这里,你一定是个很厉害的人吧 👍👍👍

各位博友觉得文章有帮助的话,别忘了点赞 + 关注哦,你们的鼓励就是我最大的动力

博主还会不断更新更优质的内容,加油吧!技术人! 💪💪💪

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

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

相关文章

中小学智慧校园电子班牌系统源码 Saas云平台模式

智慧电子班牌区别于传统电子班牌&#xff0c;智慧校园电子班牌系统更加注重老师和学生的沟通交流和及时数据交互。学校为每个教室配置一台智能电子班牌&#xff0c;一般安装于教室门口&#xff0c;用来实时显示学校通知、班级通知&#xff0c;可设置集中分布式管理&#xff0c;…

Keepalived与HaProxy的协调合作原理分析

Keepalived与HaProxy的协调合作原理分析keepalived与haproxy合作场景更好的理解方式协调合作中考虑的问题一、Keepalived以TCP/IP模型角度来分析&#xff1a;二、HaProxy总结&#xff1a;协调合作中考虑的问题的答案虚拟ip&#xff1a;虚拟IP技术&#xff0c;就是一个未分配给客…

论文笔记:Vision Transformers for Dense Prediction

中文标题: 密集预测的视觉Transformers 创新点 DPT是一种密集预测架构&#xff0c;它基于编码器-解码器的设计&#xff0c;利用一个Transformer作为编码器的基本模块。具体来说&#xff0c;我们使用最近提出的ViT作为主干架构。我们将ViT提供的tokens表示重新组合成不同分辨率…

【人脸识别】Partial-FC:让你在一台机器上训练1000万个id人脸数据集成为可能!

论文题目&#xff1a;”Killing Two Birds with One Stone: Efficient and Robust Training of Face Recognition CNNs by Partial FC“ -CVPR 2022 代码地址&#xff1a;https://arxiv.org/pdf/2203.15565.pdf 代码地址&#xff1a;https://github.com/deepinsight/insightfac…

Maxwell简介、部署、原理和使用介绍

Maxwell简介、部署、原理和使用介绍 1.Maxwell概述简介 1-1.Maxwell简介 ​ Maxwell是由美国Zendesk公司开源&#xff0c;使用Java编写的MySQL变更数据抓取软件。他会实时监控Mysql数据库的数据变更操作&#xff08;包括insert、update、delete&#xff09;&#xff0c;并将变…

【DockerCE】Docker-CE 23.0.1正式版发布

很意外啊&#xff01;Docker社区版竟然直接从20.xx.xx版本&#xff0c;升级到23.xx.xx版本了。官网地址&#xff08;For RHEL/CentOS 7.9&#xff09;&#xff1a;https://download.docker.com/linux/centos/7/x86_64/stable/Packages/23.0.1版本官方安装包如下&#xff1a;# l…

给初级开发人员的建议

#初学者#生产率#代码新手#学习在我超过 15 年的开发生涯中&#xff0c;我学到了一些可以显着提高我的效率的东西。在这篇文章中&#xff0c;我将与您分享这些经验教训。结构&#xff1a;基础建议——以下内容的重要背景和动机技术咨询——主菜推荐读物——指向非常适合入门的高…

30-Golang中的排序和查找

排序和查找排序的基本介绍交换式排序法交换式排序法-冒泡排序查找顺序查找二分查找排序的基本介绍 排序是将一组数据&#xff0c;依指定的顺序进行排列的过程 排序的分类&#xff1a; 1.内部排序&#xff1a;指将需要处理的所有数据都加载到内部存储器中进行排序。包括(交换…

20N65-ASEMI高压MOS管20N65

编辑-Z 20N65在ITO-220AB封装里的静态漏极源导通电阻&#xff08;RDS(ON)&#xff09;为0.42Ω&#xff0c;是一款N沟道高压MOS管。20N65的最大脉冲正向电流ISM为80A&#xff0c;零栅极电压漏极电流(IDSS)为10uA&#xff0c;其工作时耐温度范围为-55~150摄氏度。20N65功耗&…

Spring Boot最核心的27个注解,你了解多少?

https://blog.csdn.net/ManuMAX/article/details/129017443 导读 Spring Boot方式的项目开发已经逐步成为Java应用开发领域的主流框架&#xff0c;它不仅可以方便地创建生产级的Spring应用程序&#xff0c;还能轻松地通过一些注解配置与目前比较火热的微服务框架SpringCloud集成…

前端学习第一阶段——第五章CSS(下)

5-9 浮动 08-浮动导读 09-传统网页布局三种方式 10-为什么需要浮动 11-什么是浮动 12-浮动特性-脱标 13-浮动特性-浮动元素一行显示 14-浮动特性-浮动元素具有行内块特性 15-浮动元素经常搭配标准流的父元素 16-浮动布局练习1 <!DOCTYPE html> <html lang"en&quo…

从青铜到王者,揭秘 Serverless 自动化函数最佳配置

作者&#xff1a;丛霄 背景介绍 全托管的 Serverless 计算平台能给用户带来更少的运维代价、更强的稳定性和更快的弹性能力。 Serverless 的目标之一是免运维&#xff0c;但仍旧存在一些障碍&#xff0c;在 Serverless 场景特有的一些关键服务配置比如**“并发度”、“最小实…

史上最详细的PyCharm快速上手指南,你值得拥有

上一节中我们介绍了Python并安装了环境&#xff0c;有了Python环境我们就可以开发了吗&#xff1f;各位朋友们。 也可以也不可以&#xff01;哈哈哈不要怪我朋友们&#xff0c;我说的是事实。 如果你喜欢Python自带的Python命令开发&#xff0c;即我们所说的交互式&#xff0…

5.33 综合案例2.0 -ESP32拍照上传阿里云OSS

综合案例2.0 - ESP32拍照上传阿里云OSS案例说明连线功能实现1.阿里云平台连接2.OSS对象存储服务3.ESP32-CAM开发环境4.代码ESP32-CAM开发板代码HaaS506开发板代码测试数据转图片方法案例说明 使用ESP32拍照,将照片数据上传阿里云OSS&#xff08;通过4G网络上传&#xff09;。 …

【ArcGIS Pro二次开发】(4):ArcGIS Pro封装的窗体控件

在ArcGIS Pro&#xff0c;有一类窗体控件是系统已经封装好的&#xff0c;比如消息框、提醒框等。下面通过代码来学习一下。 新建一个项目&#xff0c;命名为【ProWindow】&#xff0c;添加5个按钮&#xff0c;命名为【Show_MessageBox、Show_NoticeBox、Show_OpenDialog、Show…

交通部互通互联码的根证书规则

引言 为了更好的服务交通互通互联码而更新这篇文章。 中金根证书其实是可以自己生成的。 代码内调整 中心公钥索引要保证自己的唯一性。 此处的唯一&#xff0c;是要保证在机具侧的唯一&#xff0c;因为他要根据这个索引去查找证书以及公钥。 提供根公钥给机具侧 生成的公钥…

“黑洞”竟是外星人的量子计算机?

宇宙中的黑洞可以用作终极量子计算机&#xff0c;我们可以从中探索它们的特征。&#xff08;图片来源&#xff1a;网络&#xff09;我们完全有理由怀疑生命在我们的宇宙中很常见&#xff0c;但是为什么我们从未发现过其他生命存在的迹象&#xff1f;这个问题几乎自现代天文学诞…

JavaScript 教程

手册简介JavaScript 是世界上最流行的脚本语言。 JavaScript 是属于 web 的语言&#xff0c;它适用于 PC、笔记本电脑、平板电脑和移动电话。 JavaScript 被设计为向 HTML 页面增加交互性。 许多 HTML 开发者都不是程序员&#xff0c;但是 JavaScript 却拥有非常简单的语法。几…

SpringBoot Data JPA配置多数据源

SpringBoot Data JPA配置多数据源1. Dependency2. Application.properties3. Code3.1 Datasource config3.2 Primary Config3.3 Second Config4. Awakening1. Dependency <dependency><groupId>com.microsoft.sqlserver</groupId><artifactId>mssql-jd…

常用设计模式介绍

java设计模式类型创建型模式&#xff1a;将对象的创建与使用分离结构型模式&#xff1a;如何将类和对象按照某种布局组成更大的格局行为型模式&#xff1a;用于描述类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务23种设计模式介绍1.单例&#xff08;Singleton&…