二叉树算法算法【二叉树的创建、插入、删除、查找】

news2024/9/21 13:31:02

一、原理

1.1、二叉排序树的插入

1.2、二叉树的删除

(1)删除度为0的节点,就是最后的叶子节点,直接删除就可以了.

(2)删除度为1的节点,就是爷爷节点接收孙子节点。

(3)删除度为2的节点就是找到该节点的前驱和后继,然后降当前节点与前驱节点的值交换,就变成了前面两度为0或者1的节点删除的情况,然后在进行删除就可以了。

二、代码

#include <iostream>
#include <vector>
#include <string>
using namespace std;
/* 对二叉树的的操作 */

/* 二叉树的节点 */
typedef struct Node
{
	int key;
	struct Node* Lchild, * Rchild;
}g_Node;

/* 创建一个节点 */
g_Node* getNewNode(int key)
{
	g_Node* node = (g_Node*)malloc(sizeof(g_Node));

	node->key = key;
	node->Lchild = NULL;
	node->Rchild = NULL;
	return node;
}

/* 向树中某个节点后插入如一个随机数节点:采用递归的方式插入树中元素 */
//g_Node* insert(g_Node* root, int key)
//{
//	if (NULL == root)  return getNewNode(key);
//	//随机插入树的左边或者右边
//	if (rand() % 2)  root->Lchild = insert(root->Lchild, key);
//	else root->Rchild = insert(root->Rchild, key);
//	return root;
//}

/* 向树中插入顺序树:创建二叉树 */
g_Node* insert(g_Node* root, int key)
{
	if (NULL == root)  return getNewNode(key);
	//随机插入树的左边或者右边
	if (key < root->key)  root->Lchild = insert(root->Lchild, key);
	else root->Rchild = insert(root->Rchild, key);
	return root;
}

/* 从根节点清理掉一个树:采用递归深入清理的方式 */
void clear(g_Node* root)
{
	if (NULL == root) return;
	clear(root->Lchild);
	clear(root->Rchild);
	free(root);
	return;
}

/* 二叉树打印函数:采用递归的方式,向内打印 */
int tot = 0;
void displayTree_V2(g_Node* root) {
	if (root == NULL) return;
	int start, end;
	tot += 1;
	start = tot;
	if (root->Lchild) displayTree_V2(root->Lchild);
	if (root->Rchild) displayTree_V2(root->Rchild);
	tot += 1;
	end = tot;
	printf("%d : [%d, %d]\n", root->key, start, end);
	return;
}

#define MAX_NODE 20
void displayTree_V1(g_Node* root) {
	g_Node* queue[MAX_NODE + 5];
	int head, tail;
	head = tail = 0;
	queue[tail++] = root;
	while (head < tail) {
		g_Node* node = queue[head];
		printf("\nnode : %d\n", node->key);
		if (node->Lchild) {
			queue[tail++] = node->Lchild;
			printf("\t%d->%d (left)\n", node->key, node->Lchild->key);
		}
		if (node->Rchild) {
			queue[tail++] = node->Rchild;
			printf("\t%d->%d (right)\n", node->key, node->Rchild->key);
		}
		head++;    //如果打印到了结尾了,tail索引就不会在增加,但是head还是增加的,最终就会跳出循环
	}
	return;
}

/* 二叉树的查找:递归的方式向下查找 */
bool findBinaryTree(g_Node* root, int key)
{
	bool ret;
	if (NULL == root) return false;
	if (key == root->key) return true;
	if (key < root->key) ret = findBinaryTree(root->Lchild, key);
	else ret = findBinaryTree(root->Rchild, key);
	return ret;
}

/* 找到节点的前驱节点 */
g_Node* getProNode(g_Node* root)
{
	if (NULL == root) return root;
	root = root->Lchild;
	while (root) root = root->Rchild;
	return root;
}

/* 
 * 二叉树删除节点:
 * (1)删除度为0的节点
 * (2)删除度为1的节点
 * (3)删除度为2的节点:找到节点的前驱,之后与前驱节点交换,
 *					     降为删除度为0和度为1的节点。
 */
g_Node* deleteNodeTree(g_Node* root, int key)
{
	if (NULL == root) return root;
	if (key < root->key) root->Lchild = deleteNodeTree(root->Lchild, key);
	else if(key>root->key) root->Rchild = deleteNodeTree(root->Rchild, key);
	else {
		//删除度为0的节点
		if (root->Lchild == NULL && root->Rchild == NULL)   
		{
			free(root);   //直接删除
			return NULL;
		}    //删除度为1的节点
		else if (root->Lchild == NULL || root->Rchild == NULL)
		{   //root的子节点由root的父节点承接
			g_Node* temp = root->Lchild ? root->Lchild : root->Rchild;
			free(root);
			return temp;
		}
		else  //删除度为2的节点
		{
			g_Node* temp = getProNode(root);   //找到节点的前驱
			root->key = temp->key;   //与前驱交换key数值
			//继续递归调用,删除掉交换值后的节点,变成度为0、1的节点删除问题。
			root->Lchild = deleteNodeTree(root->Lchild, temp->key);
		}
	}
	return root;
}


int main()
{
	g_Node* root = NULL;
	for (int i = 0; i < MAX_NODE; i++)      //创建二叉树
	{
		root = insert(root, rand() % 100);
	}
	displayTree_V1(root);
	displayTree_V2(root);
	int data = rand() % 100;
	bool ret = findBinaryTree(root, data);
	printf("find:%d, %d\r\n", ret, data);
	deleteNodeTree(root, data);
	displayTree_V2(root);
	clear(root);
	return 0;
}

最终的运行结果如下所示:

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

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

相关文章

什么软件可以约束员工摸鱼行为?「5款软件助力企业管控员工上班摸鱼!」

你的企业是否也在面临这些问题&#xff1a; 1.工作效率下降&#xff1a;频繁的分心会打断工作连贯性&#xff0c;降低任务完成的质量和速度。 2.团队协作受损&#xff1a;个别员工的低效可能导致整个团队进度滞后&#xff0c;影响项目按时交付。 3.资源浪费&#xff1a;非工…

Git —— 1、Windows下安装配置git

Git简介 Git 是一个免费的开源分布式版本控制系统&#xff0c;旨在处理从小型到 快速高效的超大型项目。 Git 易于学习&#xff0c;占用空间小&#xff0c;性能快如闪电。 它超越了 Subversion、CVS、Perforce 和 ClearCase 等 SCM 工具 具有 cheap local branching、 方便的暂…

【分布式架构幂等性总结】

文章目录 幂等性什么场景需要幂等设计&#xff1f;产生幂等性的原因解决重复操作&#xff0c;实现幂等性 幂等性 接口幂等性就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的&#xff0c;不会因为多次点击而产生了副作用。比如&#xff1a;公交车刷卡&#xff0…

.NET8 Web 利用BAT命令 一键部署 IIS - CI-CD基础

1. Windows Server 前置准备 1.1 IIS安装好 1.2 .NET8 Sdk 运行时 安装 官方下载地址&#xff1a;https://dotnet.microsoft.com/zh-cn/download/dotnet/8.0 1.3 创建一个.NET8 WebMvc项目 生成发布包 微软MVC这个项目模板直接创建&#xff0c;发布 2. 利用 BAT 来一键部署…

特效与样式(5)——Timetables的使用

第一次使用timetables做学校课表的开发&#xff0c;里面的门道东西挺多的&#xff0c;比我想的要复杂很多。包括我现在也只是实现了课表的初级效果。 主要是标题部分&#xff0c;数据部分&#xff0c;还有颜色控制部分。每个表格都需要一个控制颜色&#xff0c;每次写数据的时候…

hyperf注解,自定义注解

注解是 Hyperf 非常强大的一项功能&#xff0c;可以通过注解的形式减少很多的配置&#xff0c;以及实现很多非常方便的功能。 结构 建立注解 在app下建立Annotation注解文件夹 在Annotation下建立Jim.php注解 下面的的Annotation 和 Target是全局注解&#xff0c;所以不需…

Go学习笔记(一)语法

标准库文档&#xff1a;Go语言标准库文档中文版 | Go语言中文网 | Golang中文社区 | Golang中国 B站课程&#xff1a;8小时转职Golang工程师(如果你想低成本学习Go语言) 课程作者语雀&#xff08;首页有更多内容&#xff09;&#xff1a;8小时转职Golang工程师 语雀 代码仓…

C语言基础(二十)

链表是一种常见的数据结构&#xff0c;通常用来存储一系列元素&#xff0c;每个元素由一个节点来表示。在链表中&#xff0c;每个节点包含两部分&#xff1a;数据元素本身和指向下一个节点的指针。这种结构使得链表中的元素在内存中不是连续存储的&#xff0c;而是通过指针连接…

可拖拽表单设计器都有哪些突出特点?

为了提高效率、降低开发成本&#xff0c;利用低代码技术平台的优势特点可以实现这一目标。究竟什么是低代码技术平台&#xff1f;都有哪些值得夸耀的特点和优势&#xff1f;今天&#xff0c;我们就带着这些问题&#xff0c;一起来了解低代码技术平台、可拖拽表单设计器的多个优…

香港站群服务器优势

香港站群服务器因其独特的地理位置和网络连接优势&#xff0c;在SEO优化、网站群管理和网络营销等方面受到广泛关注。其优势主要体现在以下几个方面&#xff0c;rak小编为您整理发布。 地理位置优越 连接亚洲国际市场&#xff1a;香港作为亚太地区的重要经济中心&#xff0c;具…

华为2024年秋招-结构与材料工程师-结构方向-机试题(四套)(每套四十题)

华为2024年招聘-结构与材料工程师-结构方向-机试题&#xff08;四套&#xff09;&#xff08;每套四十题&#xff09; 岗位——结构与材料工程师 岗位意向——结构 真题题目分享&#xff0c;完整版带答案(有答案和解析&#xff0c;答案非官方&#xff0c;未仔细校正&#xff…

详细了解如何设计和实现一个SSO系统?

一、SSO系统有什么好处&#xff1f; 1、用户角度&#xff1a;一次登录多次使用&#xff0c;无需记录多套用户名和密码&#xff0c;省事省心。 2、系统管理员角度&#xff1a;管理员只需要维护好一个统一的账号中心就可以了&#xff0c;方便 3、新系统开发角度&#xff1a;新系统…

(二十六)STL vector容器(动态数组)

动态数组vector是标准模版库&#xff08;STL, Stardard Template Library&#xff09;中的模版&#xff0c;它有着节省空间和使用方便的优势&#xff0c;我们用一个形象的例子来说明&#xff1a; 开学了&#xff0c;有40个学生来报名&#xff0c;想要存储每个同学的姓名&#…

数字验证:一文弄懂UVM的factory机制

如果我们用SystemVerilog构建验证平台&#xff0c;构建好了之后&#xff0c;想改变平台中的某个组件&#xff0c;例如将driver改成driver_new&#xff0c;我们需要重新定义一下driver_new&#xff0c;当然也可以直接从driver继承。但是我们还需要在driver对象例化的地方将drive…

PHP同城派送多区域运营配送小程序源码

&#x1f69a;&#x1f4a8;「同城派送多区域运营小程序」——让每一份需求快速触达&#xff01;&#x1f308;&#x1f680; &#x1f525; 开篇燃爆&#xff1a;同城生活新风尚&#xff0c;一键速达不是梦&#xff01; Hey小伙伴们&#xff0c;你还在为找不到合适的同城服务…

WEB渗透Win提权篇-PowerUp

提权工具合集包&#xff08;免费分享&#xff09;&#xff1a; 夸克网盘分享 往期文章 WEB渗透Win提权篇-提权工具合集-CSDN博客 WEB渗透Win提权篇-RDP&Firewall-CSDN博客 WEB渗透Win提权篇-MSSQL-CSDN博客 WEB渗透Win提权篇-MYSQL-udf-CSDN博客 WEB渗透Win提权篇-Acc…

02-03:原理图与PCB交互以及快速模块化

1原理图与PCB交互 ①在PCB界面&#xff0c;点击工具, 勾选交叉选择模式 ②过滤器只选择元器件 2.按页快速模块化 配合F9快捷键

运放阻抗和噪声(同相放大器的输入/输出阻抗 + 电压跟随器阻抗 + 噪声 +信噪比)

2024-8-27&#xff0c;星期一&#xff0c;21:03&#xff0c;天气&#xff1a;阴雨&#xff0c;心情&#xff1a;晴。培训终于结束啦&#xff0c;开始轮岗了&#xff0c;看了两天PPT&#xff0c;加油加油&#xff0c;继续学习。 今天继续学习第六章运算放大器&#xff0c;主要学…

修改SpringBoot项目中MyBatis的mapper.xml文件的位置

由于MyBatis默认的mapper.xml的扫描位置是resource文件下&#xff0c;但是不可能整个项目的mapper.xml文件都放在resource下&#xff0c;如果文件较少还行&#xff0c;但是如果文件比较多&#xff0c;虽然有插件可以点击跳转&#xff0c;但是每次都这样也太麻烦了&#xff0c;所…

浙商之源——龙游商帮丨龙游商帮的具象文化符号之建筑篇

编撰者&#xff1a;袁勇 [三门源村] 三门源村位于浙江省龙游县石佛乡北部&#xff0c;距县城约28公里。因为进出村庄要经过三道屏障&#xff0c;且穿村而过的溪水又为塔石溪的源头&#xff0c;故称三门源。三门源群山环绕&#xff0c;仅有南面与金衢盆地相接&#xff0c;一泓溪…