二叉排序树的删除,全网最详解析

2023-11-15

!!!!!!!解析都在注释中,博主习惯打代码给出详细注释,这里就不做过多阐述,注释看不懂的话,直接留言!!!!!!!!!!

二叉排序树的结构声明

二叉排序树的创建

二叉排序树的节点删除


!!!!!!!解析都在注释中,博主习惯打代码给出详细注释,这里就不做过多阐述,注释看不懂的话,直接留言!!!!!!!!!!

二叉排序树的结构声明

typedef struct KeyNode
{
	int key;
	int otherData;
}keyNode,*PkeyNode; //设置关键字项和其他信息项
typedef struct BiTree
{
	KeyNode data;
	BiTree * Lchild;
	BiTree * Rchild; //指向左右孩子域
}BiTree,*PBiTree; //二叉树

二叉排序树的创建

void Insert_BST(PBiTree &T,int v) //插入元素V 每次都从树根节点向下遍历 
{
	if(!T)
	{
		printf("找到合适的位置,正在插入...\n");
		PBiTree new_node = (PBiTree)malloc(sizeof(BiTree));
		new_node->data.key = v;
		new_node->Lchild = NULL;
		new_node->Rchild = new_node->Lchild;
		T = new_node;
	}
	else if (v<T->data.key)
	{
		printf("%d 比节点值 %d 小 观察左节点\n",v,T->data.key);
		Insert_BST(T->Lchild,v);
	}
	else if (v>T->data.key)
	{
		printf("%d 比节点值 %d 大 观察节右节点\n",v,T->data.key);
		Insert_BST(T->Rchild,v);
	}
	//返回根节点
}
void Create_BST(PBiTree & T)
{
	T= NULL;
	int node;
	printf("输入根节点的值,-1结束\n");
	scanf_s("%d",&node);
	while (node!=-1)
	{
		Insert_BST(T,node);
		scanf_s("%d",&node);
	}
}

二叉排序树的节点删除

bool Dele_BiTNode(PBiTree & T,int key) //删除二叉排序树,要求删除节点后,排序树依然是有序的
{ //key -> 要删除的关键节点
	PBiTree f = NULL;
	PBiTree p = T; //
	PBiTree q = NULL;
	//根节点不为空
	while (p)
	{
		if (p->data.key==key) //找到当前节点,退出循环,记录p的位置
		{
			break;
		}
		//没有找到就一直向下找,用f记录删除节点的双亲节点
		f = p;
		if (key>p->data.key)
		{
			p = p->Rchild;
		}
		else
		{
			p = p->Lchild;
		}
	}
	 //退出循环,有两种情况
	 //①遍历结束都没有找到,此时p为空
	if(!p)
	{
	 return false;
	}
	//②成功找到该节点,但是需要判断删除的节点是否存在左子树or右子树
	//1.删除的节点同时存在左孩子和右孩子,此时应该找到删除节点的左孩子上中序遍历的最后一个节点
	//也就是左孩子中最大的节点S,这样才能保证替换后整体顺序不变
	//★★★ 那么,左孩子的最大节点一定是最右的节点所以肯定没有右孩子,这时就需要判断S节点是否有左节点
	//★★★如果S有左节点,需要设置一个临时变量q保存S的双亲,将S的左节点加到q的右孩子上
	//可以理解为痛失S孩子,含泪收养S的孩子
	q = p;
	if (p->Lchild!=NULL&&p->Rchild!=NULL)
	{
		//直接找p左子树上的最右节点
		PBiTree s = p->Lchild;
		while (s->Rchild)
		{
			q = s; //q是s的双亲
			s = s->Rchild;
		}
		p->data = s->data;
		if (q!=p) //q!=p 说明s不是p的直接后继节点
		{
			q->Rchild = s->Lchild; //痛失s节点含泪收养s的孩子
		}
		else
		{
			//q==p 说明s是p的直接后继
			q->Lchild = s->Lchild; //直接将s的孩子并入同p地址的左孩子
		}
		delete s;
		return true; 
		//删除节点同时存在左孩子和右孩子的程序结束,也是最难的部分
	}
	//2.删除的节点只有左子树
	if (!p->Rchild)
	{
		//重接左子树
		p = p->Lchild;
	}
	else if(!p->Lchild)
	{
		//重接右子树
		p = p->Rchild; //记住这里的f指向依然是p,此时p被覆盖,f指向迷失,需要用q重新拾回
	}
	//3.如果删除的是根节点
	if (!f)
	{
		T = p; //重新定义根节点
	}
	//这里就涉及到上面所说的指针迷失,需要为f重新指向删除节点后的左孩子or右孩子。
	else if(f->Lchild ==q)
	{
	//如果删除的是左子树,重接左子树
		f->Lchild = p;
	}
	else
	{
		f->Rchild = p; //重接右子树
	}
	delete q; //释放暂存指针
	return true;
}

实现效果

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二叉排序树的删除,全网最详解析 的相关文章

随机推荐

  • 从CNN到Transformer:基于PyTorch的遥感影像、无人机影像的地物分类、目标检测、语义分割和点云分类

    更多资讯 请关注 Ai尚研修科研技术动态 公众号 我国高分辨率对地观测系统重大专项已全面启动 高空间 高光谱 高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成 将成为保障国家安全的基础性和战略性资源 随着小卫星星座的普
  • Java 集合 --- Collection 框架

    Java 集合 Collection 框架 Collection Interface Concrete Implementations LinkedList ArrayList ArrayList 和 LinkedList的区别 Queue
  • 丢失OCR,Voting Disk后如何重建

    在10gR2的RAC中 Votedisk只能通过dd进程备份 假设没有Votedisk备份或OCR也损坏且没有备份 那么可以重新执行节点的root sh脚本来初始化Votedisk和OCR 之后使用VIPCA RACGONS SRVCTL等
  • Linux系统中查看可执行程序的所在目录

    前言 在嵌入式开发中 有时候需要知道可执行程序的所在目录 在工作中 遇到一次定制开发 是集成对方公司的算法 对方要求把模型文件放到和可执行程序相同的目录下 当时完全不知道可执行程序在设备的哪个目录 因为没有遇到过也没有思考过这个问题 当时也
  • 快速排序和归并排序哪个快?

    两个排序的基本思想都是分治 分而治之 实现一般都使用递归实现 1 快速排序 双边指针 交换法 记录分界值 创建左右指针 记录下标 以第一个元素为分界值 先从右向左找出比分界值小的数据 然后从左向右找出比分界值大的数据 左右指针下标未过界 交
  • 30K的月薪,是个什么段位?

    Java程序员30K的月薪 是个什么段位 大家可以参照BAT等一线大厂的职级 一般是高级工程师和资深工程师的职位 在阿里是p6 p7左右 在百度是t5左右 腾讯是t2 3左右 在京东是t3 1 美团是p6左右 掌握的技能树主要包含哪个方面
  • 【SEAN的日志】如何突破微信小程序2M限制?

    微信小程序限制2M大小一直是很多开发者的痛 我也是其中之一 网上已经有分包的解决方案 即使用subPackages 具体使用网上已经有很多教程我这里就不多赘述了 当大家可能有需求需要在小程序上实现比较复杂的功能时就需要引入各种库 而wx小程
  • Java方法重载与方法重写的区分

    在Java的学习与开发中我们经常要用到方法重载和方法重写 那么这两个概念有什么区别呢 一 方法重载 Overload 重载 overloading 是在一个类里面 方法名字相同 而参数不同 返回类型可以相同也可以不同 每个重载的方法 或者构
  • jquery/js input 输入金额或者文字放大显示

  • Android 调用系统发短信界面,给指定号码发短信,并带短信内容

    工具类如下ContentUtil java package com zhoucj messagedemo util import android content Context import android content Intent i
  • 这里有好多小巧的绿色工具呀,感觉是神级的

    http www nirsoft net
  • 训练yolo时报错RuntimeError: result type Float can‘t be cast to the desired output type __int64个人解决方案

    运行YOLOv5 6 1和yolor的时候 训练都没能正常运行 均出现了如下错误 AutoAnchor 5 00 anchors target 1 000 Best Possible Recall BPR Current anchors a
  • QT入门Buttons之QToolButton

    目录 一 界面布局介绍 1 布局器中的位置及使用 2 控件的界面属性 2 1对象名称和大小设置 2 2对象文本设置和鼠标箭头更改 2 3 扁平化样式 二 属性功能介绍 1 显示箭头属性 2 按钮风格 3 添加默认action属性 三 Dem
  • 第一次护网HW心得

    以下内容为本人参加第一次护网HW的心得 纯属个人体会 大家看着玩就好 文章目录 背景 实战理解 背景 我开始接触实战 是从某省的第五届网络空间安全竞赛开始的 我参加过第四届比赛 是标准的CTF形式 初赛线上做题 决赛线下AWD攻防 但第五届
  • TOOLS_Pandas groupby 分组聚合常用方法使用示例

    TOOLS Pandas groupby 分组聚合常用方法使用示例 根据给定列中的不同值对数据点 行 进行分组 分组后的数据可以计算生成组的聚合值 注意 下文仅是常用的一些示例 实际操作时可组合使用的方式要多得多 import pandas
  • selenium之Chromedriver更换geckodriver遇到的问题

    记录一下自己有谷歌驱动更换到火狐驱动遇到的问题 因为之前都是使用谷歌驱动 对于火狐了解甚少 几乎就没有用过 尴尬 早上醒来使用谷歌驱动打开目标网站的时候竟然是显示空白网页 刚开始还没有在意 以为是谷歌浏览器自动更新了 简单的以为更新一下最新
  • Picgo的gitee图床简略设置及gitee图片仓库无法使用解决方案

    一 Typora Picgo实现图片上传生成在线链接 Typora是大家耳熟能详的一个文档编写工具 但是我们使用Typora去插入图片时 都是使用的本地缓存图片 如果我们需要将文档发给别人或者电脑清楚缓存以后 就会出现缺失图片的尴尬现象 所
  • 阿里云无影云电脑是干什么用的?五大使用场景

    阿里云无影云电脑是一种易用 安全 高效的云上桌面服务 阿里云无影云电脑可用于高数据安全管控 高性能计算等要求的金融 设计 视频 教育等领域 适用于多种办公场景 如远程办公 多分支机构 安全OA 短期使用 专业制图等 阿里云百科来简单分享什么
  • 解决tensorflow 2.0 里的tensorflow..contrib.tensorboard.plugins import projector报错

    题主尝试用v1 api 即 错误的代码如下 from tensorflow compat v1 contrib tensorboard plugins import projector 报错没有contrib这个模块 原因是tensorfl
  • 二叉排序树的删除,全网最详解析

    解析都在注释中 博主习惯打代码给出详细注释 这里就不做过多阐述 注释看不懂的话 直接留言 二叉排序树的结构声明 二叉排序树的创建 二叉排序树的节点删除 解析都在注释中 博主习惯打代码给出详细注释 这里就不做过多阐述 注释看不懂的话 直接留言