hello树先生——二叉搜索树

news2024/11/24 7:02:06

文章目录

  • 一.搜索二叉树的性质
  • 二,功能函数接口
    • 1.二叉树的节点结构,分为左右指针和数据
    • 2.二叉树的插入函数
    • 3.删除接口
    • 4.中序遍历
  • 三.测试项目

一.搜索二叉树的性质

  • 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
  • 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
  • 它的左右子树也分别为二叉搜索树
  • 在这里插入图片描述
    如图,为一个常规的搜索二叉树。

二,功能函数接口

1.二叉树的节点结构,分为左右指针和数据

    template<class K>
	struct BSTreeNode
	{
		BSTreeNode* _left;
		BSTreeNode* _right;
		K _key;
		BSTreeNode(const K& key)
			:_left(nullptr),
			_right(nullptr),
			_key(key),
		{}
	};

搜索二叉树的数据结构仍然仅需维护一个node*的指针root就好

typedef BSTreeNode<K> node;
node* _root = nullptr;

2.二叉树的插入函数

bool insert(const K& key)

如果要插入的根节点为空的话,仅需要将插入节点赋为根

//如果根为空
			if (_root == nullptr)
			{
				_root = new node(key);
				return true;
			}

寻找目标插入的位置,从根节点开始向下寻找
由于我们寻找到的cur为目标节点的孩子,所以需要用parent记录目标节点

//找到目标值
			node* parent = nullptr;
			node* cur = _root;
			while (cur)
			{
				//key < cur
				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->_right = cur;
			}
			else
			{
				parent->_left = cur;
			}
			return true;

3.删除接口

	bool erase(const K& key)

首先找到需要删除的目标节点

				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(parent == nullptr)
						if (cur == _root)
						{
							_root = cur->_right;
						}
						//自己为右子树,父亲的右子树指向cur的右子树
						else if (cur == parent->_right)
						{
							parent->_right = cur->_right;
						}
						//自己为左子树,父亲的左子树指向cur的左子树
						else
						{
							parent->_left = cur->_left;
						}

						delete cur; 
					}

如果右子树为空

					//右子树为空
					else if (cur->_left == nullptr)
					{
						if (cur == _root)
						{
							_root = cur->_right;
						}
						//自己为右子树,父亲的右子树指向cur的右子树
						if (cur == parent->_right)
						{
							parent->_right = cur->_right;
						}
						//自己为左子树,父亲的左子树指向cur的左子树
						else
						{
							parent->_left = cur->_left;
						}
						delete cur;
					}
					

左右都不为空,则不能简单删除,而需要替换法
在这里插入图片描述
将需要删除的节点与右数的最小节点交换

                    //都不为空
					else
					{

						//替换法删除
						//利用右子树最小节点
						node* rightminparent = cur;
						node* rightmin = cur->_right;
						while (rightmin->_left)
						{
							rightminparent = rightmin;
							rightmin = rightmin->_left;
						}
						swap(rightmin->_key, cur->_key);
							//相当于处理rightmin右孩子的数据
						if (rightminparent->_left == rightmin)
							rightminparent->_left = rightmin->_right;
						else
							//目标无左孩子
							rightminparent->_right = rightmin->_right;
						delete rightmin;
					}

4.中序遍历

由于搜索二叉树特性所以中序遍历是有序结构,且在插入时当相同key插入会限制插入,所以兼顾排序和去重。

	void InOrder()
		{
			_InOrder(_root);
			cout << endl;
		}
	private:
		void _InOrder(node* root)
		{
			if (root == nullptr)
			{
				return;
			}
			_InOrder(root->_left);
			cout << root->_key<<" "<<root->_value << endl;
			_InOrder(root->_right);
		}

三.测试项目


	void test1()
	{
		BSTree<int> b;
		int a[] = { 2,6,4,7,9,10,22,1,6,5 };
		for (auto e : a)
		{
			b.insert(e);
		}
		b.InOrder();
		for (auto e : a)
		{
			b.erase(e);
		}
		b.InOrder();
	}

在这里插入图片描述

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

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

相关文章

uniapp scroll-view滚动触底加载 height高度自适应

背景&#xff1a; scroll-view组件是使用&#xff0c;官网说必须给一个高度height&#xff0c;否则无法滚动&#xff0c;所以刚开始设置了<scroll-view :style"height: 94vh" :scroll-y"true">设置了一个高度&#xff0c;想着vh应该挺合适的&#xf…

眼镜清洗机哪个品牌好?2024超声波清洗机推荐

眼镜作为日常生活不可或缺的配件&#xff0c;其卫生状况直接影响着我们的健康。日常简单的擦拭往往忽略了隐匿于镜片细微处的细菌群落&#xff0c;未彻底清洁的眼镜可能潜藏健康隐患。因此&#xff0c;深度清洁眼镜显得尤为关键&#xff0c;而超声波清洗机正是一种高效便捷的解…

探索《黑神话:悟空》背后的先进技术

黑神话&#xff1a;悟空》是一款备受期待的国产动作角色扮演游戏&#xff0c;凭借其令人惊叹的画面效果和极具深度的游戏玩法&#xff0c;吸引了全球玩家的目光。究竟是什么让这款游戏如此出色&#xff1f;让我们一起来探讨《黑神话&#xff1a;悟空》在开发过程中采用的几项尖…

java计算机毕设课设—固定资产管理系统(附源码、文章、相关截图、部署视频)

这是什么系统&#xff1f; java计算机毕设课设—固定资产管理系统(附源码、文章、相关截图、部署视频) 获取资料方式在最下方 本系统主要用于高校中的“资产”进行管理。具体地讲&#xff0c;固定资产管理系统就是通过资产的增加、删除、查看、借出、归还、维修等一系列手段…

lvs-nat的https模式设置

前言&#xff1a;LVS工作模式分为NAT模式、TUN模式、以及DR模式。在lvs服务器上&#xff0c;设置虚拟ip并做负载均衡使用。使用LVS架设的服务器集群系统有三个部分组成&#xff1a;最前端的负载均衡层&#xff08;Loader Balancer&#xff09;&#xff0c;中间的服务器群组层&a…

NCH DrawPad Pro for Mac/Win:强大的图像编辑处理软件

NCH DrawPad Pro for Mac/Win是一款功能全面的图像编辑和设计软件&#xff0c;专为Mac和Windows用户设计。它不仅适用于专业设计师&#xff0c;也深受业余爱好者和创意工作者的喜爱。DrawPad Pro凭借其丰富的绘图工具、强大的编辑功能和便捷的模板库&#xff0c;为用户提供了卓…

书生大模型实战营基础(3)——LangGPT结构化提示词编写实践

目录 0、基础知识 1、准备 1.1环境配置 1.2创建项目路径 2、模型部署 2.1获取模型 2.2部署模型为OpenAI server 3.提示工程(Prompt Engineering) 3.1 什么是Prompt 3.2 什么是提示工程 3.3 提示设计框架 4、任务 4.1利用LangGPT优化提示词 0、基础知识 Prompt&…

在Ubuntu系统上使用Docker部署.NET 6程序

基础用法 1. 安装Docker 首先&#xff0c;确保你的Ubuntu系统上安装了Docker。可以通过以下命令安装Docker&#xff1a; sudo apt update sudo apt install docker.io 安装完成后&#xff0c;启动Docker并设置为开机自启&#xff1a; sudo systemctl start docker sudo sys…

站长神器,AI批量生成原创文章工具免费用还能自动发布到站点

今天给大家带来的一款站长神器软件&#xff0c;一个专业AI原创文章批量自动生成工具&#xff0c;支持多种CMS&#xff0c;站群内容一键式管理分发&#xff0c;支持多任务创建&#xff0c;自动根据文章内容关联配图&#xff0c;每条任务支持独立AI模型、独立创作风格、独立写作模…

一体化运维管理软件在大中型机房管理中的挑战与应对方案

随着信息化技术的不断发展&#xff0c;大、中型机房作为企业数据处理与存储的核心场所&#xff0c;其运维管理的复杂性和挑战性也日益增加。面对日益增长的运维需求和不断变化的业务环境&#xff0c;传统的手工运维方式已经无法满足现代机房管理的要求。因此&#xff0c;一体化…

Vulnhub靶场 | DC系列 - DC5

文章目录 DC-5信息收集扫描靶机的IP地址扫描开放的端口访问80端口 文件包含漏洞渗透过程向日志中写入一句话木马使用蚁剑连接webshell在 /tmp下新建文件 一句话木马&#xff08;留个后门&#xff09;使用蚁剑虚拟终端反弹shell到kali在kali开启监听使用蚁剑虚拟终端反弹shell到…

OpenCV库的一些实用代码示例

OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库&#xff0c;它提供了大量的图像和视频分析功能。除了你提到的灰度转换、图像反转、高斯滤波和图像保存等基本操作外&#xff0c;OpenCV还包含许多其他功能&#xff…

linux Vim的安装和基本使用

Vim 什么是 Vim Vim是一个高度可定制的文本编辑器&#xff0c;源自Unix系统的vi编辑器。它被广泛用于类Unix系统中&#xff0c;包括Linux、Mac OS和Windows平台。Vim特别受到程序员的青睐&#xff0c;因为它提供了丰富的编程功能&#xff0c;如代码补全、编译及错误跳转等。这…

Apache Struts2开发模式漏洞解析与修复

1.引言 在现代Web应用开发中&#xff0c;Apache Struts2是一个广泛使用的MVC框架。然而&#xff0c;当一些开发方便的功能错用在生产环境时&#xff0c;会导致严重的安全隐患。本文将详细解析Struts2开发模式&#xff08;devMode&#xff09;带来的安全风险及其修复方法。 2.…

vim常用快捷键问答

vim的光标位置操作快捷键有哪些&#xff1f;怎样记忆它们&#xff1f; 在 Vim 中&#xff0c;光标位置的操作快捷键非常重要&#xff0c;可以帮助你更高效地编辑文本。下面是一些常用的光标位置操作快捷键&#xff1a; 基本移动 h&#xff1a;光标左移一个字符j&#xff1a;光…

【吊打面试官系列-Redis面试题】Redis 是单进程单线程的?

大家好&#xff0c;我是锋哥。今天分享关于 【Redis 是单进程单线程的&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; Redis 是单进程单线程的&#xff1f; Redis 是单进程单线程的&#xff0c;redis 利用队列技术将并发访问变为串行访问&#xff0c;消除了传统…

Linux-vim

文章目录 vi和vimvim的基本概念vim的基本操作vim正常模式命令集插入模式从插入模式切换为命令模式移动光标删除文字复制替换撤销上一次操作更改跳至指定的行 vim末行模式命令集列出行号跳到文件中的某一行查找字符保存文件推出vim vi和vim vi/vim的区别简单点来说&#xff0c;…

【初学人工智能原理】【14】机器学习:最后一节课也是第一节课(完结)

前言 本文教程均来自b站【小白也能听懂的人工智能原理】&#xff0c;感兴趣的可自行到b站观看。 代码及工具箱 本专栏的代码和工具函数已经上传到GitHub&#xff1a;1571859588/xiaobai_AI: 零基础入门人工智能 (github.com)&#xff0c;可以找到对应课程的代码 正文 随着…

制作 Docker 镜像

目录 1 docker镜像介绍 1.1 docker的镜像结构 1.2 镜像运行的基本原理 1.3 镜像获得方式 2 构建 docker 镜像 Dockerfile 2.1 Dockerfile 基础参数介绍 2.2 实现参数功能示例 2.2.1 FROM LABEL COPY 2.2.2 ADD 2.2.3 ENV 和 CMD与ENTRYPOINT 2.2.3.1 CMD的替代性 2.2.3.2 EN…

使用3D数字人做视频

用3D数字人做视频 漂亮精致 3D数字人定制4 动作流畅、音乐上的表现 thatgirl 支持私人定制模型 你愿意捐献所有的财产吗 想搭建这样的数字人的请和我们联系 使用3D数字人做视频https://www.jinshuangshi.com/forum.php?modviewthread&tid248 (出处: 金双石科技)