图解二叉搜索树

news2024/11/17 0:33:02

gitee代码:https://gitee.com/WangZihao64/data-structure-and-algorithm/tree/master/BST

一、概念

二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:

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

在这里插入图片描述

二、查找

从根开始比较,查找,比根大则往右边走查找,比根小则往左边走查找

最多查找高度次,走到到空,还没找到,这个值不存在

bool Find(const K& val)
    {
        Node* cur=_root;
        while(cur)
        {
            if(cur->_val>val)
            {
                cur=cur->_left;
            }
            else if(cur->_val<val)
            {
                cur=cur->_right;
            }
            else
            {
                return true;
            }
        }
        return false;
    }

三、插入

树为空,则直接新增节点,赋值给root指针

树不空,按二叉搜索树性质查找插入位置,插入新节点

//插入可能失败,因为我们不能插入相同的值
    bool Insert(const K& val)
    {
        //头插
        if(_root== nullptr)
        {
            _root=new Node(val);
            return true;
        }
        Node* cur=_root;
        //左子树所有值小于其根节点的值
        //右子树所有值大于其根节点的值
        //记录前一个节点
        Node* prev= nullptr;
        while(cur)
        {
            if(cur->_val<val)
            {
                prev=cur;
                cur=cur->_right;
            }
            else if(cur->_val>val)
            {
                prev=cur;
                cur=cur->_left;
            }
            //值相同
            else
            {
                return false;
            }
        }
        cur=new Node(val);
        if(val>prev->_val)
        {
            prev->_right=cur;
        }
        else
        {
            prev->_left=cur;
        }
        return true;
    }

四、删除

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

1.要删除的结点无孩子结点

2.要删除的结点只有左孩子结点

3.要删除的结点只有右孩子结点

4.要删除的结点有左、右孩子结点

在处理上我们的情况1可以和情况2,3合并起来,所以这里着重理解2,3,4这三种情况

首先第2种情况我们可以看作删除14

在这里插入图片描述

14这个结点只有左孩子,我们只需要让10这个结点的右孩子指向14的左孩子即可,第3种情况的处理方法和第2种是一样的(也包括第一种),如果是这样的一棵树,并且我们需要删除头节点,就需要单独处理

在这里插入图片描述

bool Erase(const K& val)
    {
        Node* cur=_root;
        Node* parent=_root;
        while(cur)
        {
            if(cur->_val>val)
            {
                parent=cur;
                cur=cur->_left;
            }
            else if(cur->_val<val)
            {
                parent=cur;
                cur=cur->_right;
            }
            //找到了对应的value
            else
            {
                //有一个为空,如果是根节点需要单独处理
                if(cur->_left== nullptr)
                {
                    if(_root==cur)
                    {
                        _root=cur->_right;
                    }
                    else
                    {
                        if(parent->_left==cur)
                        {
                            parent->_left=cur->_right;
                        }
                        else
                        {
                            parent->_right=cur->_right;
                        }
                    }
                    delete cur;
                }
                else if(cur->_right== nullptr)
                {
                    if(_root==cur)
                    {
                        _root=cur->_left;
                    }
                    else
                    {
                        if(parent->_left==cur)
                        {
                            parent->_left=cur->_left;
                        }
                        else
                        {
                            parent->_right=cur->_left;
                        }
                    }
                    delete cur;
                }
                //左右都不为空,下面处理
                else
                {
                    
                }
                return true;
            }
        }
        return false;
    }

情况4(左右结点都不为空)

我们需要找左子树的最大结点或者找右子树的最小结点(这里找右子树的最小结点)

在这里插入图片描述

/2种方案: 1.左子树中找最大的,即找到左子树然后一直向右查找(因为右子树一定比根大)
                    //2.右子树中找最小的,即找到右子树然后一直向左查找(因为左子树一定比根小)
                    //这里采用从右子树中找最小的
                    Node* minright=cur->_right;
                    Node* prev=cur;
                    while(minright->_left)
                    {
                        prev=minright;
                        minright=minright->_left;
                    }
                    swap(cur->_val,minright->_val);
                    if(prev->_left==minright)
                    {
                        prev->_left=minright->_right;
                    }
                    else
                    {
                        prev->_right=minright->_right;
                    }
                    delete minright;

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

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

相关文章

网站怎么接入chatGPT来自动写文章

用chatGPT写文章接入网站 将ChatGPT集成到网站中&#xff0c;可以让用户在网站上快速、简便地生成文章&#xff0c;并且可以提高用户体验。以下是一些用ChatGPT写文章接入网站的方法&#xff1a; 使用ChatGPT API接口&#xff1a;OpenAI提供了GPT-3 API接口&#xff0c;您可以…

c++11 常用新特性大总结

1.统一的初始化列表 在c98中我们经常会用{}初始化数组&#xff0c;而为了更近一步初始化我们在c11中采用{}的形式&#xff0c;代替等于号来帮助我们初始化的进行 举个例子&#xff1a; struct Point {int _x;int _y; }; int main() {int array1[] { 1, 2, 3, 4, 5 };int ar…

2023年七大最佳勒索软件解密工具

勒索软件是目前最恶毒且增长最快的网络威胁之一。作为一种危险的恶意软件&#xff0c;它会对文件进行加密&#xff0c;并用其进行勒索来换取报酬。 幸运的是&#xff0c;我们可以使用大量的勒索软件解密工具来解锁文件&#xff0c;而无需支付赎金。如果您的网络不幸感染了勒索软…

【MySQL】实验七 视图

文章目录 1. 建立city值为上海、北京的顾客视图2. 建立城市为上海的客户2016年的订单信息视图3. SQL视图:建立视图AVG_CJ4. SQL视图:建立视图IS_STUDENT5. SQL视图:建立视图CJ_STUDENT6. SQL视图:根据视图CJ_STUDENT创建视图CJ_TJ1. 建立city值为上海、北京的顾客视图 建立…

webgl-画一个彩色矩形

html <!DOCTYPE html> <head> <style> *{ margin: 0px; padding: 0px; } </style> </head> <body> <canvas id webgl> 您的浏览器不支持HTML5,请更换浏览器 </canvas> <script src"./main.js"></script&g…

基于七牛云和PicGo的图床搭建

第一次搭建的博客因为误操作且没有备份导致无法访问和恢复。第二次搭建吸取了第一次的错误&#xff0c;并且准备用图床进行图片的访问。 需要用到的&#xff1a; 七牛云&#xff0c; PicGo&#xff0c; Typora&#xff0c; 已备案域名。 七牛云和域名 进入七牛云的页面&…

Nginx 服务器 SSL 证书安装部署

工具&#xff1a;WinSCP、putty 1.下载证书 cloud.tencent.com_bundle.crt 证书文件cloud.tencent.com_bundle.pem 证书文件&#xff08;可忽略该文件&#xff09;cloud.tencent.com.key 私钥文件cloud.tencent.com.csr CSR 文件 2.上传证书到服务器 通过WinSCP将已获取到的…

Linux宝塔面板搭建Discuz论坛, 并公网远程访问【内网穿透】

文章目录前言1.安装基础环境2.一键部署Discuz3.安装cpolar工具4.配置域名访问Discuz5.固定域名公网地址6.配置Discuz论坛前言 Crossday Discuz! Board&#xff08;以下简称 Discuz!&#xff09;是一套通用的社区论坛软件系统&#xff0c;用户可以在不需要任何编程的基础上&…

paddle实现手写数字识别终章

要点&#xff1a; 资源配置训练调试恢复训练模型部署参考文档&#xff1a; paddle官方文档 一 资源配置 1 概述 从前几节的训练看&#xff0c;无论是房价预测任务还是MNIST手写字数字识别任务&#xff0c;训练好一个模型不会超过10分钟&#xff0c;主要原因是我们所使用的神…

T 级数据量迁移!知名云巨头如何从 Jira 切换至 ONES?

2021 年&#xff0c;Atlassian 旗下 Jira&Confluence 等系列产品 Server 版&#xff08;本地私有化部署版&#xff09;全面停售&#xff0c;并将在 2024 年停止维护&#xff0c;Server 版客户必须迁移至 Cloud&#xff08;云&#xff09;或 Data Center&#xff08;数据中心…

最新阿里、腾讯、华为、字节等大厂的薪资和职级对比,看看你差了多少...

互联网大厂新入职员工各职级薪资对应表(技术线)~ 最新阿里、腾讯、华为、字节跳动等大厂的薪资和职级对比 上面的表格不排除有很极端的收入情况&#xff0c;但至少能囊括一部分同职级的收入。这个表是“技术线”新入职员工的职级和薪资情况&#xff0c;非技术线(如产品、运营、…

Unicode 编码表

正则查找: 中文文字中文符号表情符号... [^\x00-\xff] 其中 \x00-\xff 匹配 ASCII 代码中十六进制代码为 00-ff 的字符&#xff0c; 加个取反 ^ &#xff0c;则就表示表示匹配非单字节的字符&#xff0c;例如汉字&#xff0c;汉字符号等字符集。 中文文字&#xff08;简体繁…

python形态学滤波:腐蚀、膨胀、开、闭运算

文章目录二值形态学灰度形态学最基础的形态学操作有四个&#xff0c;分别是腐蚀、膨胀、开计算和闭计算&#xff0c;scipy.ndimage分别实现了二值数组和灰度数组的这四种运算 二值灰度binary_erosiongrey_erosion腐蚀binary_dilationgrey_dilation膨胀binary_closinggrey_clos…

快速部署专业领域AI处理网站

当前AI大型语言模型展示了很强的信息整合与处理能力&#xff0c;但一些专业知识方面的问答知识量还不够完善&#xff0c;我们在AI的基础上增加了内容训练数据库&#xff0c;相关内容自动添加到AI内容数据库索引。在使用时&#xff0c;可以实时根据对话内容进行检索调取相关上下…

谷歌发布Self-Debug方法,让大模型学会自己修bug,一次性生成正确代码

文 | 智商掉了一地你有没有想过&#xff0c;让一台计算机诊断和修复自己生成的错误代码&#xff1f;一篇最新的研究论文介绍了一种名为 Self-Debugging 的技术&#xff0c;通过在生成的代码中添加自解释的信息&#xff0c;让计算机像一个可以自己修复代码的程序员一样调试自己的…

CAN CRC校验15_CAN FD与CAN协议区别

1 概述 CAN-FD&#xff1a;可以理解成CAN协议的升级版&#xff0c;只升级了协议&#xff0c;物理层未改变。 CAN与CAN-FD主要区别&#xff1a;传输速率不同、数据长度不同、帧格式不同、ID长度不同。 2 传输速率不同 CAN&#xff1a;最大传输速率1Mbps。 CAN-FD&#xff1…

MIPI D-PHYv2.5笔记(16) -- Preamble Sequence、HS-Idle State、Sync Patterns

声明&#xff1a;作者是做嵌入式软件开发的&#xff0c;并非专业的硬件设计人员&#xff0c;笔记内容根据自己的经验和对协议的理解输出&#xff0c;肯定存在有些理解和翻译不到位的地方&#xff0c;有疑问请参考原始规范看 Preamble Sequence 前导码序列&#xff08;Preamble …

chatGPT爆火,什么时候中国能有自己的“ChatGPT“

目录 引言 一、ChatGPT爆火 二、中国何时能有自己的"ChatGPT" 三、为什么openai可以做出chatGPT? 四、结论 引言 随着人工智能技术的不断发展&#xff0c;自然语言处理技术也逐渐成为了研究的热点之一。其中&#xff0c;ChatGPT作为一项领先的自然语言处理技术…

【ChatGPT】ChatGPT还能保持多久的神话?

文章目录引言正文ChatGPT的由来ChatGPT的影响乱象频出ChatGPT未来的走势引言 最近ChatGPT的热度持续拔高&#xff0c;一个功能强大的AI迅速引爆了全世界&#xff0c;上到技术大佬&#xff0c;下到平民百姓&#xff0c;都在讨论并使用这个“跨时代的”的技术。有人拿它聊天&…

前端已死?金三银四?你收到offer了吗?

目录 一、前言 二、“唱衰” 三、不局限于框架、前端 四、打动面试官 五、正向加成 六、小结 一、前言 最近在脉脉、知乎等平台都有人在渲染前端从业人员的危机&#xff0c;甚至使用“前端已死”的字眼&#xff0c;颇有“语不惊人死不休”的意味&#xff0c;对老鸟来说&a…