C++——二叉搜索树

二叉搜索树

二叉搜索树: 又为搜索二叉树,一般具有以下的性质

  • 若它的左子树不为空,则左子树上所有的节点的值都小于父亲节点
  • 若它的右子树不为空,则右子树上所有的节点的值都大于父亲节点
  • 它的左右子树也都为二叉搜索树

在这里插入图片描述

二叉搜索树操作:

以下面图示例子

在这里插入图片描述

int a[] = {8, 3, 1, 10, 6, 4, 7, 14, 13};

1、二叉搜索树的查找

  • 从根开始比较,查找,比根大就往右子树走,比根小就往左子树走
  • 最多查找树的高度,如果走到空,就说明没有这个值,查找失败
    bool Find(const K& key)
    {
        Node* cur = _root;
        if(cur->_key> key)
        {
            cur = cur->_left;
        }
        else if(cur->_key < key)
        {
            cur = cur->_right;
        }
        else 
        {
            return true;
        }

        return false;
    }

2、二叉搜索树的插入

插入的具体过程如下:

  • 树为空,则直接新增节点,赋值给root指针
  • 树不为空,按二叉搜索树性质查找新增位置,插入新增节点
  • 如果插入的值与它本身的值相等,就失败,二叉搜索树中不能有相同的值
  • 在这里插入图片描述
bool Insert(const K& key)
    {
        //判断是不是空
        if(_root == nullptr)
        {
            _root = new Node(key);
            return true;
        }
        //不是空,就插入
        Node* cur = _root;
        Node* parent = nullptr;
        while(cur)
        {
            if(cur->_key > key)
            {
                parent = cur;
                cur = cur->_left;
            }
            else if(cur->_key < key)
            {
                parent = cur;
                cur = cur->_right;
            }
            else
            {
                return false;
            }
        }

        //到这里说明是空
        cur = new Node(key);
        //链接
        if(parent->_key > key)
            parent->_left = cur;
        else parent->_right = cur;

        return true;
    }

3、二叉搜索树的删除

首先查找元素是否存在二叉搜索树中,如果不存在,则返回,否则要删除的节点要分以下四种情况:

  • 要删除的节点无孩子节点
  • 要删除的节点只有左孩子
  • 要删除的节点只有右孩子
  • 要删除的节点有左右孩子

首先这里可以说是三种情况,因为如果没有孩子节点,那么就会进入到只有左孩子或者只有右孩子的节点的情况。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

    bool Erase(const K& key)
    {
        Node* parent = nullptr;
        Node* cur = _root;
        while(cur)
        {
            if(cur->_key > key)
            {
                parent = cur;
                cur = cur->_left;
            }
            else if(cur->_key < key)
            {
                parent = cur;
                cur = cur->_right;
            }
            else
            {
                //cur的左为空
                if(cur->_left == nullptr)
                {
                    if(cur == _root)
                        _root = cur->_right;
                    else
                    {
                        if(cur == parent->_left)
                        {
                            parent->_left = cur->_right;
                        }
                        else if(cur == parent->_right)
                        {
                            parent->_right = cur->_right;
                        }
                    }

                    delete cur;
                    return true;  
                }
                else if(cur->_right == nullptr)// cur->_right为空
                {
                    if(cur == _root)
                        _root = cur->_right;
                    else 
                    {
                        if(cur == parent->_left)
                            parent->_left = cur->_left;
                        else if(cur == parent->_right)
                            parent->_right = cur->_left;
                    }

                    delete cur;
                    return true;
                }
                else
                {
                    //替换法  右数最小节点或者左树最大节点,然后赋值,删除最小/最大节点
                    //如果都不为空
                    Node* rightMinParent = cur; //这里必须赋值为cur,因为如果是头删这里就会有问题
                    Node* rightMin = cur->_right;

                    //找右数中最小的值
                    while(rightMin->_left)
                    {
                        rightMinParent = rightMin;
                        rightMin = rightMin->_left;
                    }

                    cur->_key = rightMin->_key;

                    //此时rightMin的左子树为空,右子树可能有值
                    if(rightMin == rightMinParent->_left)
                        rightMinParent->_left = rightMin->_right;
                    else rightMinParent->_right = rightMin->_right;

                    delete rightMin;
                    return true;
                }
            }
        }

        return false;
    }

二叉搜索树的性能分析:

二叉搜索树的插入和删除操作都需要查找,所以查找是二查搜索树中的性能关键。

如果有n个节点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树的平均查找长度的关键就在于树的深度。

如果树是一颗二叉平衡搜索二叉树,那么查找的效率就是O(logN)
在这里插入图片描述

当然也有特殊的场景,如下图所示,它的查找效率就会变得非常慢,平均比较次数就达到了O(N^2)
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue前端实现一个本地消息队列(MQ), 让消息延迟消费或者做缓存

MQ功能实现的具体代码(TsMQ.ts)&#xff1a; import { v4 as uuidx } from uuid;import emitter from /utils/mittclass Message {// 过期时间&#xff0c;0表示马上就消费exp: number;// 消费标识&#xff0c;避免重复消费tag : string;// 消息体body : any;constructor( exp…

Docker基础篇(六) dockerfile体系结构语法

FROM&#xff1a;基础镜像&#xff0c;当前新镜像是基于哪个镜像的 MAINTAINER &#xff1a;镜像维护者的姓名和邮箱地址 RUN&#xff1a;容器构建时需要运行的命令 EXPOSE &#xff1a;当前容器对外暴露出的端口号 WORKDIR&#xff1a;指定在创建容器后&#xff0c;终端默认登…

python中的类与对象(1)

目录 一. 引子&#xff1a;模板 二. 面向过程与面向对象 &#xff08;1&#xff09;面向过程编程 &#xff08;2&#xff09;面向对象编程 三. 对象与类 &#xff08;1&#xff09;对象 &#xff08;2&#xff09;类 四. 面向对象程序设计的特点&#xff1a;封装&#…

daydayEXP: 支持自定义Poc文件的图形化漏洞利用工具

daydayEXP: 支持自定义Poc文件的图形化漏洞利用工具 基于java fx写的一款支持加载自定义poc文件的、可扩展的的图形化渗透测试框架。支持批量漏洞扫描、漏洞利用、结果导出等功能。 使用 经过测试,项目可在jdk8环境下正常使用。jdk11因为缺少一些必要的组件,所以jdk11版本工…

sqli-labs第46关

注&#xff1a;说明借鉴&#xff08;现阶段水平不够&#xff0c;只能靠借鉴来完成本次作业&#xff0c;若侵权&#xff0c;必删&#xff09; 基于Sqli-Labs靶场的SQL注入-46~53关_sqli-lab less46-CSDN博客 SQL-Labs46关order by注入姿势-CSDN博客 一、首先需要sql-labs的环…

计算机设计大赛 深度学习图像风格迁移

文章目录 0 前言1 VGG网络2 风格迁移3 内容损失4 风格损失5 主代码实现6 迁移模型实现7 效果展示8 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习图像风格迁移 - opencv python 该项目较为新颖&#xff0c;适合作为竞赛课题…

StringBuffer StringBuilder

String 为什么StringBuilder是线程不安全的&#xff1f;StringBuffer是线程安全的&#xff1f; - Jacian - 博客园 (cnblogs.com) StringBuilder 线程安全的可变字符学序列 速度快 StringBuffer 线程不安全的可变字符序列 创建StringBuilder对象 new StringBuilder&…

【Java程序员面试专栏 算法思维】二 高频面试算法题:二分查找

一轮的算法训练完成后,对相关的题目有了一个初步理解了,接下来进行专题训练,以下这些题目就是汇总的高频题目,本篇主要聊聊二分查找,包括基础二分,寻找目标值的左右边界,搜索旋转数组以及波峰,以及x的平方根问题,所以放到一篇Blog中集中练习 题目关键字解题思路时间空…

BlackWidow靶场

kali&#xff1a;192.168.223.128 主机发现 nmap -sP 192.168.223.0/24 目标IP:192.168.223.153 端口扫描 nmap -sV -p- -A 192.168.223.153 22/tcp open ssh OpenSSH 7.9p1 Debian 10deb10u2 (protocol 2.0) 80/tcp open http Apache httpd 2.4.38 ((Deb…

【C++】类与对象——友元,内部类,匿名对象

类与对象 1 友元1.1 概念&#xff1a;1.2 友元函数1.3 友元类 2 内部类概念&#xff1a;特性&#xff1a;举例&#xff1a; 3 匿名对象Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&#xff01;&#xff01;&#xff01;下一篇文章见&#xff01;&#xff01;&am…

定制红酒:设计专属标签与包装,打造与众不同个性

在云仓酒庄洒派的定制红酒服务中&#xff0c;为消费者提供个性化、专属的标签与包装设计是提升红酒与众不同性和纪念价值的关键环节。通过巧妙的设计&#xff0c;消费者可以打造出与众不同的红酒&#xff0c;展现自己的个性与品味。 首先&#xff0c;标签设计是展现红酒个性的重…

Mysql 的高可用详解

Mysql 高可用 复制 复制是解决系统高可用的常见手段。其思路就是&#xff1a;不要把鸡蛋都放在一个篮子里。 复制解决的基本问题是让一台服务器的数据与其他服务器保持同步。一台主库的数据可以同步到多台备库上&#xff0c;备库本身也可以被配置成另外一台服务器的主库。主…

MYSQL--(1.存储引擎 *2.事务*)

一 存储引擎: 1.介绍 1>在数据库管理系统当中通过使用数据引擎来实现数据的增删改,查询 2>不同的存储引擎提供的有不同的存储机制,索引技巧等功能 MYSQL的核心,就是存储引擎 3>同样的,用户也可以根据自己的需要进行选择,更改自己需要…

用c# 自己封装的Modbus工具类库源码

前言 Modbus通讯协议在工控行业的应用是很多的&#xff0c;并且也是上位机开发的基本技能之一。相关的类库也很多也很好用。以前只负责用&#xff0c;对其并没有深入学习和了解。前段时间有点空就在这块挖了挖。想做到知其然还要知其所以然。所以就有了自己封装的Modbus工具类库…

Vue+SpringBoot打造在线课程教学系统

目录 一、摘要1.1 系统介绍1.2 项目录屏 二、研究内容2.1 课程类型管理模块2.2 课程管理模块2.3 课时管理模块2.4 课程交互模块2.5 系统基础模块 三、系统设计3.1 用例设计3.2 数据库设计 四、系统展示4.1 管理后台4.2 用户网页 五、样例代码5.1 新增课程类型5.2 网站登录5.3 课…

WampServer环境下载安装并结合内网穿透实现远程访问管理界面

文章目录 前言1.WampServer下载安装2.WampServer启动3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 Wamp 是一个 Windows系统下的 Apache PHP Mysql 集成安装环境&#xff0c;是一组常用来…

华为配置WDS背靠背业务示例

配置WDS背靠背业务示例 组网图形 图1 配置WDS背靠背组网示意图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件 业务需求 在某些企业网络中&#xff0c;有线网络部署受施工条件的限制&#xff0c;需要连接的网络之间有障碍物或传输距离较远&#xff0c;AP无法全…

这家宠物品牌的内容运营怎么做的?太好玩儿了吧

养宠的朋友应该多多少少对“诚实一口”这个牌子有所耳闻&#xff0c;2018年诚实一口品牌正式立项&#xff0c;虽然不算经典品牌&#xff0c;但在国内也是小有名气的宠物品牌。今天媒介盒子想和大家聊的不是产品&#xff0c;而是想聊聊作为成立时间不长的国产宠粮品牌是如何凭借…

5.4 内容管理模块 - 课程搜索

5.4 内容管理模块 - 课程搜索 文章目录 5.4 内容管理模块 - 课程搜索一、快速入门1.1 需求分析1.2 业务流程1.3 准备环境1.3.1 搭建 elasticsearch1.3.2 索引 概念 1.4 课程信息索引同步1.4.1 技术方案 一、快速入门 本项目使用elasticsearch作为索引及搜索服务 课程如果发布之…

Sora抢饭碗!好莱坞大亨停止,8亿美元投资

好莱坞消息&#xff0c;著名演员、影视投资人Tyler Perry在看到OpenAI最新发布的文生视频模型Sora后&#xff0c;停止了8亿&#xff08;约57亿元&#xff09;美元的投资。 该投资项目位于亚特兰大&#xff0c;本来要扩展十几个摄影棚用于影视剧的拍摄&#xff08;类似横店影视…