二叉排序树详解及实现

news2024/12/27 10:08:13

二叉排序树详解及实现

  • 1.什么是二叉排序树
  • 2.二叉排序树的数据结构
    • 2.1二叉排序树的节点类型
    • 2.2二叉排序树中插入某个元素
    • 2.3 二叉排序树中按值查找元素
    • 2.4 找排序二叉树中的最小值
    • 2.5返回排序二叉树中ptr中序遍历的后续节点
    • 2.6 寻找排序二叉树中的最大值
    • 2.7 寻找二叉树中中序遍历ptr节点的前驱
    • 2.8中序遍历排序二叉树(从小到大打印排序二叉树所有元素)
    • 2.9 逆向打印排序二叉树(从大到小打印排序二叉树所有元素)
    • 2.10删除排序二叉树的结点元素为value的结点
  • 3.具体程序及运行结果

1.什么是二叉排序树

二叉排序树(Binary Sorting Tree)又称二叉搜索树(Binary Search Tree),是一种特殊结构的二叉数,作为一种排序和查找的手段,对应有序表的对半查找,通常亦被称为数表。其定义也是递归的。

二叉排序树的定义:
每个节点都有一个作为搜索依据的关键码(key),所有节点的关键码互不相同;
二叉排序树或者是空树或者是具有下述性质的二叉数,
	①其左子树上所有结点的数据值均小于根结点的数据值;
	②右子树上所有结点的数据值均大于根结点的数据值;
	③左子树和右子树又各是一棵二叉排序树。
二叉排序树用中序遍历就可以得到由小到大的有序序列

2.二叉排序树的数据结构

2.1二叉排序树的节点类型

typedef struct BstNode//二叉树的节点类型
{
	KeyType key;	
	BstNode* parent;//父节点
	BstNode* leftchild;//左孩子
	BstNode* rightchild;//右孩子
}BstNode;

在这里插入图片描述

2.2二叉排序树中插入某个元素

bool Binary_Sort_Tree::Insert_Value(KeyType value)
{
//如果是一棵空树
	if (root ==nullptr)
	{
		root = MakeNode(value);//建立一个根节点
		return true;
	}

//如果不是一棵空树		
	BstNode* ptr = root;
	BstNode* parent = NULL;//记录ptr的父节点

	while (ptr != NULL && ptr->key != value)
	{
		parent = ptr;
		ptr = value > ptr->key ? ptr->rightchild : ptr->leftchild;
	}
//case1:插入相同元素
	if (ptr != NULL && ptr->key == value) return false;//不能插入相同元素
//case2:空位置
	ptr = MakeNode(value);
	ptr->parent = parent;

	if (ptr->key > parent->key) { parent->rightchild = ptr; }
	else { parent->leftchild = ptr; }
	cursize++;
	return true;
}

2.3 二叉排序树中按值查找元素

如果要查找的元素值>根节点值,就在根节点右边查找,否则在根节点左边查找。
BstNode* Binary_Sort_Tree::FindValue(KeyType value)
{
	BstNode* ptr = root;

	while (ptr != nullptr && ptr->key != value)
	{
		ptr = value > ptr->key ? ptr->rightchild : ptr->leftchild;
	}
	return ptr;
}

2.4 找排序二叉树中的最小值

根据排序二叉树的性质,可以很轻松的得到最小值即为最左边节点的值。
BstNode* Binary_Sort_Tree::FirstNodeByMiddleOrder()
{
	BstNode* ptr = root;
	while (ptr && ptr->leftchild)
	{
		ptr = ptr->leftchild;
	}
	return ptr;
}

2.5返回排序二叉树中ptr中序遍历的后续节点

节点ptr的后续节点为排序二叉树中第一个比ptr->key大的元素,即可以分为如下两种情况:
①如果ptr存在右子树,则ptr的后续节点为ptr右子树的最左端的节点。
②如果ptr不存在右子树,则ptr的后续节点可以回溯到根节点
具体如下:
BstNode* Binary_Sort_Tree::NextNodeByMiddleOrder(BstNode* ptr)
{			
	if (ptr == NULL) return ptr;
	if (ptr->rightchild != NULL)
	{
		return FirstNodeByMiddleOrder(ptr->rightchild);//右子树的最左端
	}
	else
	{
		BstNode* parent = ptr->parent;
		while (parent != NULL && parent->leftchild != ptr)//pa->rightleft == ptr;
		{
			ptr = parent;
			parent = ptr->parent;
		}
		return parent;
	}
}

2.6 寻找排序二叉树中的最大值

根据排序二叉树的性质,可以很轻松的得到最小值即为最右边节点的值。
BstNode* Binary_Sort_Tree::LastNodeByMiddleOrder()
{
	BstNode* ptr = root;
	while (ptr && ptr->rightchild)
	{
		ptr = ptr->rightchild;
	}
	return ptr;
}

2.7 寻找二叉树中中序遍历ptr节点的前驱

节点ptr的前驱为排序二叉树中第一个比ptr->key小的元素,即可以分为如下两种情况:
①如果ptr存在左子树,则ptr的后续节点为ptr左子树。
②如果ptr不存在左子树,则ptr的后续节点可以回溯到根节点
具体如下:
BstNode* Binary_Sort_Tree::PrecursorofPtr(BstNode* ptr)
{
	if (ptr == NULL) return ptr;
	if (ptr->leftchild != NULL)
	{
		return LastNodeByMiddleOrder(ptr->leftchild);//左子树的最右端
	}
	else
	{
		BstNode* parent = ptr->parent;
		while (parent != NULL && parent->rightchild != ptr)//pa->rightleft == ptr;
		{
			ptr = parent;
			parent = ptr->parent;
		}
		return parent;
	}
}

2.8中序遍历排序二叉树(从小到大打印排序二叉树所有元素)

void Binary_Sort_Tree::MiddleOrder()
{
	cout << "排序二叉树的非递归中序遍历:" << endl;
	BstNode* ptr = FirstNodeByMiddleOrder();
	for (; ptr != nullptr; ptr = NextNodeByMiddleOrder(ptr))
	{
		cout << ptr->key << "  ";
	}
	cout << endl;
}

2.9 逆向打印排序二叉树(从大到小打印排序二叉树所有元素)

void Binary_Sort_Tree::ReverseInorder()
{
	BstNode* ptr = root;
	cout << "二叉排序树的逆向打印:" << endl;
	for (BstNode* p = LastNodeByMiddleOrder(ptr); p != NULL; p = PrecursorofPtr(p))
	{
		cout << p->key << "  ";
	}
	cout << endl;
}

2.10删除排序二叉树的结点元素为value的结点

删除某个元素可分为以下三种情况:
①如果是叶子节点直接删除即可。
②如果不是叶子节点具体讨论如下:	
bool Binary_Sort_Tree::RemoveNode(KeyType value)
{
	BstNode* ptr = root;
	//空树的删除
	if (ptr == NULL) return false;

	BstNode* pa = NULL;
	BstNode* p = ptr;

	while (p && p->key != value)
	{
		//pa = p;
		p = value < p->key ? p->leftchild : p->rightchild;
	}
	//没有找到这个结点
	if (p == NULL) return false;

	//双分支
	if (p->leftchild && p->rightchild)
	{
		BstNode* q = FirstNodeByMiddleOrder(p->rightchild);
		p->key = q->key;
		p = q;
	}

	//单分支
	pa = p->parent;
	BstNode* child = p->leftchild != NULL ? p->leftchild : p->rightchild;
	if (child)
	{
		child->parent = pa;
	}
	if (pa == NULL)
	{
		ptr = child;
	}
	else
	{
		if (pa->leftchild == p)
		{
			pa->leftchild = child;
		}
		else
		{
			pa->rightchild = child;
		}
	}
	cursize--;
	//直接是叶子
	delete p;
	return true;
}

3.具体程序及运行结果

程序如下:
二叉排序树的代码下载
在这里插入图片描述

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

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

相关文章

《痞子衡嵌入式半月刊》 第 68 期

痞子衡嵌入式半月刊: 第 68 期 这里分享嵌入式领域有用有趣的项目/工具以及一些热点新闻,农历年分二十四节气,希望在每个交节之日准时发布一期。 本期刊是开源项目(GitHub: JayHeng/pzh-mcu-bi-weekly),欢迎提交 issue,投稿或推荐你知道的嵌入式那些事儿。 上期回顾 :…

【分布式事务之spring实践】分布式事务选型实战

Spring中使用事务 Spring是一个伟大的框架&#xff0c;从一开始只是一个容器框架&#xff0c;到现在已经发展成为了一个包含企业开发中的方方面面的很多框架的总称。它不但从复杂度上&#xff0c;发展出了用于各个方面的子框架。它还从易用性出发&#xff0c;推出了像Spring-B…

多旅行商问题:世界杯优化算法(World Cup Optimization,WCO)求解多仓库多旅行商问题(提供Matlab代码)

一、世界杯优化算法 世界杯优化算法&#xff08;World Cup Optimization&#xff0c;WCO)由Navid Razmjooy等人于2016年提出&#xff0c;该算法模拟了国际足联世界杯比赛&#xff0c;思路新颖&#xff0c;收敛速度快&#xff0c;全局寻优能力强。 算法原理参考&#xff1a;智…

[附源码]Node.js计算机毕业设计河南美丽乡村旅游信息网Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

[附源码]Nodejs计算机毕业设计基于远程协作的汽车故障诊断系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

DevOps实战系列【第十四章-完结篇】:Jenkins Pipeline最佳实践案例

个人亲自录制全套DevOps系列实战教程 &#xff1a;手把手教你玩转DevOps全栈技术 我们将之前的案例&#xff0c;使用流水线构建一下 搭建一个Jenkinsfile模型 pipeline {agent anystages {stage(拉取gitlab项目代码) {steps {echo "拉取git代码"}}stage(构建代码) {…

FRP进阶篇之解决方案

目录 一、前言 二、多客户端使用 1、场景 2、解决方案 3、使用 3.1、服务端配置 3.2、客户端配置 3.3、结果验证 三、dashboard 仪表盘使用 1、场景 2、解决方案 3、使用 4、验证 5、使用Java调用API接口获取设备列表 5.1、样例代码 5.2、结果验证 一、前言 通…

27. SAP OData 框架里的缓存(Cache)设计专题讲座

本教程前一篇文章,25. 答疑 - SAP OData 框架处理 Metadata 元数据请求的实现细节,前后端组件部署在同一台物理服务器,我们介绍了 SAP OData 框架处理 metadata 请求的流程,如下图所示: 其中左边的分支,当读取本地服务器的 metadata 时,OData 框架会从 Share Memory 即共…

npm-开发自己的包并发布

目录 1.开发自己的包 1.1. 需要实现的功能 1.2. 初始化包的基本结构 1.3. 初始化 package.json 1.4. 在 index.js 中定义格式化时间的方法 1.5. 在 定义转义 和还原HTML 的方法 1.6. 编写包的说明文档 1.7包的入口文件 2.发布自己的包 2.1注册npm账号 2.2登录npm账…

Jmeter(二十):jmeter对图片验证码的处理

jmeter对图片验证码的处理 在web端的登录接口经常会有图片验证码的输入&#xff0c;而且每次登录时图片验证码都是随机的&#xff1b;当通过jmeter做接口登录的时候要对图片验证码进行识别出图片中的字段&#xff0c;然后再登录接口中使用&#xff1b; 通过jmeter对图片验证码…

Qt下载安装及配置教程

进入qt中文网站&#xff1a;https://www.qt.io/zh-cn/ 下载开源版 往下滑&#xff0c;下载Qt在线安装程序 它已经检测出我的是windows系统&#xff0c;直接点击download就好。如果是其它的系统&#xff0c;需要找到对应自己系统的安装包。 然后跟网速有关&#xff0c;等…

计算机毕业设计springboot+vue大学生个人财务管理系统

项目介绍 本大学生个人财务管理系统设计目标是实现收入和支出的信息化管理,提高管理效率,使得支出收入管理工作规范化、科学化、高效化。 本文研究的大学生个人财务管理系统基于springboot架构,采用JSP技术、JAVA编程语言和MYSQL数据库设计开发。通过本系统,实现了管理员和用户…

设计模式之享元模式

Flyweight design pattern 享元模式的概念、享元模式的结构、享元模式的优缺点、享元模式的使用场景、享元模式的实现示例、享元模式的源码分析 1、享元模式的概念 享元模式&#xff0c;即运用共享技术来有效的支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少…

基于nodejs博客系统的设计与实现.rar(论文+源码+ppt文档+视频录制)

第一章绪论 3 1.1项目开发的背景和意义 3 1.2国内外研究的现状 4 1.3研究的主要内容 4 第2章系统相关技术介绍 5 2.1 B/S结构技术介绍 5 2.2nodejs技术介绍 6 2.3mysql数据库 7 第三章系统分析 8 3.1可行性分析 8 3.2功能需求分析 8 3.2.1登录模块需求分析 9 3.2.2分类博客模块…

NetSuite 如何统一用户的时区

在NetSuie的原始设置中&#xff0c;用户可以设置自己的时区&#xff0c;这在单一国家的环境中实际上是个缺点。例如&#xff0c;有些客户并没有注意到自己的时区是否是本国时区&#xff0c;所以在查看系统日志时&#xff0c;发现时间不对头&#xff0c;产生了困扰。所以&#x…

操作系统,计算机网络,数据库刷题笔记13

操作系统&#xff0c;计算机网络&#xff0c;数据库刷题笔记13 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xf…

SpringBoot3.0自定义stater整合chatGPT49种应用场景代码已开源

导读 导读 | 12月总体来说互联网的技术圈是非常热闹的&#xff0c;chatGPT爆火&#xff0c;SpringBoot3.0发布等重磅陆消息续进入大家的视线&#xff0c;而本文作者将以技术整合的角度&#xff0c;带大家把最火的两个技术整合在一起。读完本文&#xff0c;你将熟悉SpringBoot3…

我的java学习

犹豫了很久&#xff0c;还是打算简述一下自己学java 的历程&#xff0c;花了些时间&#xff0c;但结果不赖 文章目录从0的开始开始加速过度项目学习懵懂的进入项目进入综合项目学习第二次学习开始从0的开始 没有计算机基础&#xff0c;英语也非常糟糕。 起初也时常在想&#x…

Java+MySQL基于SSM的高校科研仪器共享平台

随着在校学生人数的不断增加,学生的数量也在不断的增加,同时面临的就是如何更加方便快捷和高效的管理高校科研仪器的问题,传统模式的科研仪器管理明显已经不能够满足当下的需求,于是我们提出了高校科研仪器共享平台的设计与开发。 本课题是一个基于SSM的管理系统,本高校科研仪器…

架构设计(六):引入消息队列

架构设计&#xff08;六&#xff09;&#xff1a;引入消息队列 作者&#xff1a;Grey 原文地址&#xff1a; 博客园&#xff1a;架构设计&#xff08;六&#xff09;&#xff1a;引入消息队列 CSDN&#xff1a;架构设计&#xff08;六&#xff09;&#xff1a;引入消息队列…