【1++的数据结构】之二叉搜索树

👍作者主页:进击的1++
🤩 专栏链接:【1++的数据结构】


文章目录

  • 一,什么是二叉搜索树
  • 二,二叉搜索树的操作及其实现
    • 2.1 插入操作及其实现
    • 2.2 查找操作及其实现
    • 2.3 删除操作及其实现
  • 三,构造及其析构
  • 四,二叉搜索树的应用

在这里插入图片描述

一,什么是二叉搜索树

二叉搜索书又叫二叉排序树或二叉查找树,其左子数上的节点小于根节点;右子树上的节点大于根节点。
如图,就是一颗二叉搜索树。
在这里插入图片描述

二,二叉搜索树的操作及其实现

2.1 插入操作及其实现

二叉搜索树的插入其先根据插入值的大小确定插入的位置,并且,若是有相同的值则不会进行插入。确定位置的依据是我们上述的二叉搜索树的特性:左子树上的节点小于根节点;右子树上的节点大于根节点。
当确定好位置后,我们申请节点,将新节点链接到树中。
下面是插入的两种实现:

  1. 非递归:
typedef BSTreeNode<K> Node;public:bool Insert(const K& key){if (_root == nullptr){_root = new Node(key);return true;}Node* cur = _root;Node* parent = _root;//记录其父节点,方便链接while (cur != nullptr)//找位置{if (key < cur->_key){parent = cur;cur = cur->left;}else if (key > cur->_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;}
  1. 递归
	bool InsertR(const K& key){return _InsertR(_root, key);}bool _InsertR(Node*& root,const K& key){if (root == nullptr)//为空则说明已经找好了位置,可以进行插入{Node* cur = new Node(key);root = cur;return true;}if (key < root->_key){_InsertR(root->left, key);}else if (key > root->_key){_InsertR(root->right, key);}else{return false;//遇到相同的值}return true;}

由于在类外无法访问根节点_root,所以无法给_InsertR()传参,因此我们,多写了一层函数,在类里面调用插入的递归函数。这里有一个非常重要的细节就是在传root时我们使用的是引用。这时我们就可以直接进行链接,不需要记录其父节点了。

2.2 查找操作及其实现

其查找利用其二叉搜索树的特性,当树为完全二叉树或满二叉树时,其效率可以达到lgN (N为数的高度)。
下面为查找的两种实现方法:

  1. 非递归:
bool Find(const K& key){Node* cur = _root;while (cur){if (key < cur->_key){cur = cur->left;}else if (key > cur->_key){cur = cur->right;}else{return true;}}return false;}
  1. 递归实现
bool _FindR(Node*& root, const K& key){if (root == nullptr){return false;}if (key < root->_key){_FindR(root->left, key);}else if (key > root->_key){_FindR(root->right, key);}else{return true;}}

2.3 删除操作及其实现

删除操作我们可以分为几种情况:

  1. 删除节点没有孩子
  2. 删除节点有右孩子
  3. 删除节点有左孩子
  4. 删除节点有左右孩子
    对这四种情况我们又可以进行合并,将1与2,3归为一类。
    对于有两个节点的情况,我们在找到要删除节点后,在找到右子树的最小值或左子树的最大值,将其值与删除节点值进行交换,这时,我们就只需要删除右子树最小值或左子树最大值了。
    需要注意的是:其右子树最小值或左子树最大值后可能还有节点,因此要进行判断。

非递归:

bool Erase(const K& key){Node* cur = _root;Node* parent = _root;while (cur != nullptr){if (key < cur->_key){parent = cur;cur = cur->left;}else if (key > cur->_key){parent = cur;cur = cur->right;}else{//左为空if (cur->left == nullptr){if (cur == _root){_root = cur->right;}else if (key < parent->_key){parent->left = cur->right;}else{parent->right = cur->right;}delete cur;}else if (cur->right == nullptr)//右为空{if (cur == _root){_root = cur->left;}else if (key < parent->_key){parent->left = cur->left;}else{parent->right = cur->left;}delete cur;}else//都不为空{//先找右子树的最小值Node* Minparent = cur;Node* Min=cur->right;while (Min->left != nullptr){Minparent = Min; Min = Min->left;}std::swap(Min->_key, cur->_key);if (Minparent->left == Min){Minparent->left = Min->right;}else{Minparent->right = Min->right;}delete Min;}return true;}}return false;}

递归:

	bool _EraseR(Node*& root, const K& key){if (root == nullptr){return false;}if (key < root->_key){_EraseR(root->left, key);}else if (key > root->_key){_EraseR(root->right, key);}else{Node* del = root;//找右子树最小if (root->left == nullptr){root = root->right;}else if (root->right == nullptr){root = root->left;}else{Node* min = root->right;//找右子树最小值while (min->left){min = min->left;}std::swap(root->_key, min->_key);return _EraseR(root->right, key);}delete del;return true;}}

三,构造及其析构

//拷贝构造BSTree(const BSTree<K>& t){_root = Copy_root(t._root);}Node* Copy_root(Node* root){if (root == nullptr){return nullptr;}Node* copy_root = new Node(root->_key);copy_root->left = Copy_root(root->left);copy_root->right = Copy_root(root->right);return copy_root;}//赋值重载BSTree& operator=(BSTree<K> T){std::swap(T._root,this->_root);return *this;}//析构~BSTree(){Destory(_root);}void Destory(Node* root){if (root == nullptr){return;}Destory(root->left);Destory(root->right);delete root;root = nullptr;}

拷贝构造有一些像前序遍历,我们遇到一个节点就构造一个节点,最后在递归返回时将其链接起来。
析构函数则是像后续遍历。

四,二叉搜索树的应用

  1. K模型:K模型即只有key作为关键码,结构中只需要存储Key即可,关键码即为需要搜索到的值。
  2. KV模型:每一个关键码key,都有与之对应的值Value,即<Key, Value>的键值对。如,中英文对照。

二叉搜索树的性能:对于插入和删除来说,都必须要先查找:插入查找插入的位置,删除查找删除的节点。因此其查找的性能代表了二叉树的性能。其查找的性能于树的深度有关,但对于同一个集合,其插入的顺序不同,那么形成的树也是不同的。我们期望的最好的情况是它能够形成一个完全二叉树或接近完全二叉树的树。此时他的查找的效率能够达到lgN;但其也有可能会形成一个单支树,此时效率最差,为N。
在这里插入图片描述

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

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

相关文章

天津最新python培训班就业形势 python能就业吗?

小编认为Python是一门非常适合学习的编程语言&#xff0c;无论性别如何。它易于学习、功能强大&#xff0c;并且在各个领域都有广泛的应用&#xff0c;因此&#xff0c;性别不应该成为学习Python的障碍&#xff0c;那么学习Python是否就能找到满意的工作呢&#xff1f; 这是一…

eclipse Java Editor Templates

​ Window - Preferences - Java - Editor - Templates ​ date ${currentDate:date(yyyy.MM.dd)}

A33 QT 主线例程 opengl

点击查看 HW33-050 HW33-070 规格书 HW33-050 HW33-070 支持 android 系统和 Linux QT。 HW33-XXX采用4 核Cortex-A7 ARM、Mali400MP2 GPU架构&#xff0c;主频 1.2GHz 的 CPU。内存 存储标配分别为1GB、8GB&#xff0c;内置显卡为Mali400MP2&#xff0c;支持 H.264 1080P …

经典CNN(三):DenseNet算法实战与解析

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊|接辅导、项目定制 1 前言 在计算机视觉领域&#xff0c;卷积神经网络&#xff08;CNN&#xff09;已经成为最主流的方法&#xff0c;比如GoogleNet&#xff0c;…

基于YOLOv7开发构建MSTAR雷达影像目标检测系统

MSTAR&#xff08;Moving and Stationary Target Acquisition and Recognition&#xff09;数据集是一个基于合成孔径雷达&#xff08;Synthetic Aperture Radar&#xff0c;SAR&#xff09;图像的目标检测和识别数据集。它是针对目标检测、机器学习和模式识别算法的研究和评估…

EP4CE6E22C8 FPGA最小系统电路原理图+PCB源文件

资料下载地址&#xff1a;EP4CE6E22C8 FPGA最小系统电路原理图PCB源文件 一、原理图 二、PCB

linux Ubuntu 更新镜像源、安装sudo、nvtop、tmux

1.更换镜像源 vi ~/.pip/pip.conf在打开的文件中输入: pip.conf [global] index-url https://pypi.tuna.tsinghua.edu.cn/simple按下:wq保存并退出。 2.安装nvtop 如果输入指令apt install nvtop报错&#xff1a; E: Unable to locate package nvtop 需要更新一下apt&a…

Windows环境下Node.js二进制版安装教程

文章目录 前言一 下载Node.js二 设置环境变量三 配置全局安装和缓存路径四 设置仓库 前言 新版的Node.js已自带npm&#xff0c;就在Node.js下载完成解压后的文件内&#xff0c;的node_modules包中。 npm的作用&#xff1a;是对Node.js依赖的包进行管理&#xff0c;类似maven。…

云运维工具

企业通常寻找具有成本效益的方法来优化创收&#xff0c;维护物理基础架构以托管服务器和应用程序以提供服务交付需要巨大的空间和前期资金&#xff0c;最重要的是&#xff0c;物理基础设施会产生额外的运营支出以进行定期维护&#xff0c;这对收入造成了沉重的损失。 云使企业…

vue+iviewUi+oss直传阿里云上传文件

前端实现文件上传到oss&#xff08;阿里云&#xff09;适用于vue、react、uni-app&#xff0c;获取视频第一帧图片 用户获取oss配置信息将文件上传到阿里云&#xff0c;保证了安全性和减轻服务器负担。一般文件资源很多直接上传到服务器会加重服务器负担此时可以选择上传到oss&…

Leetcode31 下一个排列

解题思路&#xff1a; 算法过程的第二步&#xff0c;可以变为将[j,end]排序&#xff0c;然后从[j,end)和i进行比较&#xff0c;在区间j,end区间第一个大于nums[i]后&#xff0c;交换即可 public void nextPermutation(int[] nums) {int len nums.length - 1;for(int i len;i…

vue-baidu-map-3x 使用记录

在 Vue3 TypeScript 项目中&#xff0c;为了采用 标签组件 的方式&#xff0c;使用百度地图组件&#xff0c;冲浪发现了一个开源库 ovo&#xff0c;很方便&#xff01;喜欢的朋友记得帮 原作者 点下 star ~ vue-baidu-map-3xbaidu-map的vue3/vue2版本&#xff08;支持v2.0、v…