C++ 二叉搜索树

文章目录

  • 二叉搜索树的概念
  • 二叉搜索树的性质
  • 二叉搜索树的模拟实现
    • 封装框架
    • 添加操作
    • 查找操作
    • 删除操作

二叉搜索树的概念

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

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

如下图:
int a[] = {8, 3, 1, 10, 6, 4, 7, 14, 13};
在这里插入图片描述

二叉搜索树的性质

  1. 二叉搜索树是的中序遍历是有序的!对于上图中序遍历的结果就是
    [1,3,4,6,7,8,10,14,13] 有序序列

2.二叉搜索树只支持增删查,不支持修改

由于插入和删除操作都必须先查找,所以查找效率代表了二叉搜索树中各个操作的性能;
但是,对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二叉搜索树的深度的函数,即结点越深,则比较次数越多。
但对于同一个关键码集合,如果各关键码插入的次序不同
可能得到不同结构的二叉搜索树:
在这里插入图片描述
查找时间复杂度:左边O(logN),右边O(N);

二叉搜索树的模拟实现

封装框架

封装节点信息

template<class K>
struct BSTreeNode //二叉搜索树封装的节点信息
{BSTreeNode<K>* _left;BSTreeNode<K>* _right;K _key;BSTreeNode(const K& key):_left(nullptr),_right(nullptr),_key(key){ }
};

封装树的信息;

template<class K>
class BSTree
{typedef BSTreeNode<K> Node;
private:Node* _root = nullptr;
}

添加操作

插入一个节点,需要和当前节点进行比较
如果插入节点小于当前节点的值,则向左走;
如果插入节点大于当前节点的值,则向右走;
如果插入节点等于当前节点的值,返回false;

bool insert(const K& key)//左小右大
{if (_root == nullptr)//第一次插入时的操作{_root = new Node(key);return true;}Node* cur = _root;Node* prev = nullptr;while (cur) // 不为空就一直查找合适位置{if (cur->_key < key) // 插入节点大于当前节点的值,则向右走;{prev = cur;cur = cur->_right;}	else if (cur->_key > key) // 插入节点小于当前节点的值,则向左走;{prev = cur;cur = cur->_left;}else if (cur->_key == key) // 插入节点等于当前节点的值,返回false;return false;}// 到根的时候确定是根的左孩子还是右孩子cur = new Node(key);if (prev->_key > key)prev->_left = cur;elseprev->_right = cur;return true;
}

查找操作

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

删除操作

1. 删除节点没有孩子节点;
直接删除,不做处理

2. 删除节点只有左孩子节点;
该节点被删除后,将该节点的左孩子连接到该节点的父亲节点

3. 删除节点只有右孩子节点;
该节点被删除后,将该节点的左孩子连接到该节点的父亲节点

bool Erase(const K& key)
{Node* parent = nullptr;Node* cur = _root;while (cur){// 寻找需要删除节点的位置if (cur->_key < key){parent = cur;cur = cur->_right;}else if (cur->_key > key){parent = cur;cur = cur->_left;}else{if (cur->_left == nullptr){	//左为空if (cur == _root){_root = cur->_right;}else{if (cur == parent->_left){parent->_left = cur->_right;}else{parent->_right = cur->_right;}}delete cur;}else if (cur->_right == nullptr){	//右为空if (cur == _root){_root = cur->_left;}else{if (cur == parent->_left){parent->_left = cur->_left;}else{parent->_right = cur->_left;}}delete cur;}else{// 最后一种情况}return true;}}return false;
}

4. 删除节点左、右孩子节点均有;
使用替换法

被替换节点需要满足下列的条件

  • 小于所有右子树的值
  • 大于所有左子树的值

即左子树中的最右节点,右子树中的最左节点

代码·


// 右树的最小节点(最左节点)
Node* parent = cur;
Node* subLeft = cur->_right;
while (subLeft->_left)
{parent = subLeft;subLeft = subLeft->_left;
}swap(cur->_key, subLeft->_key);if (subLeft == parent->_left)parent->_left = subLeft->_right;
elseparent->_right = subLeft->_right;				

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

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

相关文章

PD虚拟机和Crossover软件有什么不同?谁更强大?

PD虚拟机&#xff08;Parallels Desktop&#xff09;和Crossover软件都是为Mac用户提供在macOS上运行Windows应用程序的能力&#xff0c;但它们在设计理念、功能和使用场景上存在一些差异。 PD虚拟机&#xff08;Parallels Desktop&#xff09;的特点&#xff1a; 1. 全面的虚…

MySQL中的并发控制,读写锁,和锁的粒度

MySQL中的并发控制&#xff0c;读写锁&#xff0c;和锁的粒度 并发控制的概述 在数据库系统中&#xff0c;并发控制是一种用于确保当多个用户同时访问数据库时&#xff0c;系统能够提供数据的一致性和隔离性的机制。MySQL支持多种并发控制技术&#xff0c;其中包括锁机制、多…

用友 GRP-U8 fastjson远程代码执行漏洞复现(XVE-2024-8863)

0x01 产品简介 用友GRP-U8R10行政事业内控管理软件是用友公司专注于国家电子政务事业,基于云计算技术所推出的新一代产品,是我国行政事业财务领域最专业的政府财务管理软件。 0x02 漏洞概述 用友 GRP-U8 R10系列版本 VerifyToken 接口存在低版本fastjson反序列化漏洞,未经…

用户请求经过哪些处理(公网)

DNS服务器之间协作&#xff1a; 递归DNS查询&#xff1a;用户的请求首先发送到递归DNS服务器。 查询根DNS服务器&#xff1a;递归DNS服务器查询根DNS服务器&#xff0c;以找到管理.com顶级域的TLD DNS服务器。 查询TLD DNS服务器&#xff1a;根DNS服务器响应带有TLD DNS服务器…

centos7.6上安装mysql7.6 完整过程

安装过程&#xff1a; 参考&#xff1a;https://blog.csdn.net/qq_45103475/article/details/123151050 查找mysql [rootbogon ~]# whereis mysql mysql: /usr/lib64/mysql /usr/share/mysql 删除目录 [rootbogon ~]# rm -rf /usr/lib64/mysql [rootbogon ~]# whereis mysql m…

计算机服务器中了devicdata勒索病毒怎么处理,devicdata勒索病毒解密工具流程

随着网络技术的不断发展与应用&#xff0c;越来越多的企业离不开网络&#xff0c;通过网络可以开展各项工作业务&#xff0c;网络也为企业的生产运营提供各类极大便利&#xff0c;大大提高了生产效率&#xff0c;但网络在为企业提供便利的同时&#xff0c;也为企业的数据安全带…

AJAX——案例

1.商品分类 需求&#xff1a;尽可能同时展示所有商品分类到页面上 步骤&#xff1a; 获取所有的一级分类数据遍历id&#xff0c;创建获取二级分类请求合并所有二级分类Promise对象等待同时成功后&#xff0c;渲染页面 index.html代码 <!DOCTYPE html> <html lang&qu…

探索SAVI:土壤调整植被指数的意义与应用

​随着遥感技术的不断发展&#xff0c;植被指数成为了评估地表植被覆盖和健康状况的重要工具之一。其中&#xff0c;SAVI&#xff08;Soil Adjusted Vegetation Index&#xff0c;土壤调整植被指数&#xff09;作为一种针对土壤表面反射率进行调整的植被指数&#xff0c;在土地…

Python 基础、流程、容器、函数

一、基础语法 1.1 前言 1.1.1 Python简介 Python是一门编程语言&#xff0c;Python的作者是Guido van Rossum&#xff08;龟叔&#xff09; Python优点&#xff1a;简单易学 Python与嵌入式、集成电路行业 强大的库和工具生态系统&#xff1a;Python拥有广泛而强大的库和…

深入理解高级加密标准(Advanced Encryption Standard)

title: 深入理解高级加密标准&#xff08;Advanced Encryption Standard&#xff09; date: 2024/4/23 20:04:36 updated: 2024/4/23 20:04:36 tags: AES概述加密原理优势特点算法详解安全性应用实践案例分析 第一章&#xff1a;AES概述 AES的历史和背景 历史&#xff1a; 高…

MySQL数据库精讲001——概述

MySQL数据库精讲001——概述 文章目录 MySQL数据库精讲001——概述1.1 安装1.1.1 版本1.1.2 安装一、下载二、解压三、配置1. 添加环境变量2. 初始化MySQL3. 注册MySQL服务4. 启动MySQL服务5. 修改默认账户密码 四、登录MySQL五、卸载MySQL 1.1.3 连接1.1.4 企业使用方式(了解)…

华为数通方向HCIP-DataCom H12-821题库(多选题:321-340)

第321题 关于OSPF的命令描述,不正确的是: A、stub区域和totally stub区域配置了no-summary参数 B、OSPFv2和OSPF v3配置接口命令的区别是OSPF V2可以使用network命令,而OSPFv3直接 C、在接口上使能stubrouter命令用来配置次路由器为stub路由器,stub路由器可以与非stub路由 …

mac安装nvm管理node(手残流,git下载)

1. 准备 首先电脑里得有brew、git、vscode&#xff0c;看这里安装brew、git&#xff0c;看这里安装vscode。 我本人比较low&#xff0c;mac命令也记不熟&#xff0c;本篇就是git下载nvm&#xff0c;vscode看配置&#xff0c;省心不动脑子就可以了。 2. 清理node 如果mac里没…

javaScript中的作用域和作用域链

作用域&#xff08;Scope&#xff09; 什么是作用域 作用域是在运行时代码中的某些特定部分中变量、对象和函数的可访问性。 换句话说&#xff0c;作用域决定了代码区块中变量和其他资源的可见性。 示例&#xff1a; function outFun2() {var inVariable "内层变量2…

边缘计算是什么?

一、边缘计算是什么&#xff1f; 边缘计算是一种分布式计算范式&#xff0c;它将计算任务和数据存储从中心化的云端推向网络的边缘&#xff0c;即设备或终端&#xff0c;以提高响应速度和降低网络带宽需求。在边缘计算中&#xff0c;数据在源头附近进行处理和分析&#x…

OKR已死?是中华田园KPI?

近年来&#xff0c;关于OKR&#xff08;Objectives and Key Results&#xff0c;目标与关键成果&#xff09;和KPI&#xff08;Key Performance Indicators&#xff0c;关键绩效指标&#xff09;的讨论不绝于耳。有人宣称OKR已死&#xff0c;认为KPI才是更符合中国企业的绩效管…

Unity3d的海盗王地图

一直以来&#xff0c;都想将海盗王的地图搬到手游unity3d上面。 经过漫长时间的研究&#xff0c;终于实现了当初的想法。

网络编程-libuv介绍

官网 https://libuv.org/ 概要 libuv是一个强大的跨平台异步I/O库&#xff0c;主要用于构建高性能、可扩展的网络应用程序。它最初是为Node.js开发的&#xff0c;用于处理Node.js的异步I/O操作&#xff0c;但随着时间的推移&#xff0c;它也被广泛应用于其他系统&#xff0…

【声呐仿真】学习记录0-服务器配置docker、ros环境

【声呐仿真】学习记录0-服务器配置docker、ros环境 前言一、~~0.设置mobaXterm~~1.拉取镜像2.服务器开启xhost&#xff0c;可视化&#xff08;rviz、gazebo&#xff09;3.创建容器&#xff0c;挂载数据卷4.测试宿主机与容器数据是否同步5.测试5.0测试xclock5.1测试ros小乌龟5.2…

大模型应用RAG系列(1)初识RAG

题外话 之前我们在讲大模型的应用方向和架构时&#xff0c;有提到RAG、Agent、Fine-Tune。在作者写大模型专题的文章时&#xff0c;也是边学习&#xff0c;边梳理&#xff0c;边总结。在这个过程中&#xff0c;大模型在各个方向都不断地快速发展&#xff0c;对应的paper、理论…