二叉排序树的删除,全网最详解析
!!!!!!!解析都在注释中,博主习惯打代码给出详细注释,这里就不做过多阐述,注释看不懂的话,直接留言!!!!!!!!!!
二叉排序树的结构声明
二叉排序树的创建
二叉排序树的节点删除
!!!!!!!解析都在注释中,博主习惯打代码给出详细注释,这里就不做过多阐述,注释看不懂的话,直接留言!!!!!!!!!!
二叉排序树的结构声明
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;
}
实现效果
二叉排序树的删除,全网最详解析相关推荐
- HTML——全网VIP影视解析单页源码 自适应
文章目录[隐藏] 全网VIP影视解析单页源码+自适应 全网VIP影视解析单页源码+自适应 上传源码到服务器,访问即可使用,无需数据库,php版本没有限制 为了界面美观,不添加播放器,跳转到解析接口页面 ...
- KeePass全网最详使用指南(附全平台个人收集官网的软件)
KeePass全网最详使用指南(附全平台个人收集官网的软件) 前言: keepass全平台个人收集官网的 下载地址 访问密码:4510) 郑重警告:请不要下载和使用任何非官方来源的KeePass应用程 ...
- 基于vc的freetype字体轮廓解析_2020款丰田坦途功能详解析 价格下调折扣多_搜狐汽车...
本文车型速览 × 除了文章作者的主观观点外,我们正尝试基于全网可查的客观数据,为您提供中立.客观的参考依据: 本文部分车型速览: 畅销车型质量排行top10 展开 × 微信扫码,直接一次看完附近所有城 ...
- python清空集合_python集合删除多种方法详解
这篇文章主要介绍了python集合删除多种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 删除指定的元素 A={'a','c','b','d ...
- 折半查找和二叉排序树的时间性能_详解二叉排序树(基础篇)
前言 我们的线性表有2种,无序线性表和有序线性表. 无序线性表正如其名,它里面的数据是无序的,因为这个表不用维护什么东西,所有它的插入和删除操作的效率也不错..但是,正因为他是无序的,查找起来就很废时 ...
- 数据结构笔记(三十四)二叉排序树的删除
二叉排序树的删除 一.二叉排序树的删除情况 1.被删除的结点是叶子结点 2.被删除的结点只有一个孩子 3.被删除的节点有两个孩子 二.伪代码实现 三.算法性能分析
- Java中List集合的三种遍历方式(全网最详)
Map集合:链接: Map集合的五种遍历方式及Treemap方法 Set集合:链接: Java中遍历Set集合的三种方法 TreeSet集合:链接: Java深入了解TreeSet,和迭代器遍历方法 ...
- pandas 如何删掉第一行_pandas删除指定行详解
pandas删除指定行详解 在处理pandas的DataFrame中,如果想像excel那样筛选,只要其中的某一行或者几行,可以使用isin()方法来实现,只需要将需要的行值以列表方式传入即可,还可传 ...
- Class -- 03 -- Random类常用方法详解析
原文链接:Class – 03 – Random类常用方法详解析 相关文章: Class – 01 – System类常用方法解析 Class – 02 – Arrays类常用方法解析 Class – ...
最新文章
- 任务管理器taskmgr查看几核
- JAVA调用C语言程序
- WORD给文档设置密码保护?
- GAOT工具箱设置交叉概率和变异概率
- 八:Webpack的加载器
- 云队友丨张朝阳不再狂妄,搜狐的艰难复苏路
- h5 标签video和audio标签的下载按钮
- java中string.length_Java 中的String length() 方法
- 组合数问题(NOIP2016提高组Day2T1)
- fasttext文本分类python实现_一个使用fasttext训练的新闻文本分类器/模型
- 每日新闻:华为获首个微模块产品PUE测试证书;Linux发布Acumos AI开源架构平台;商汤技联手华侨城中学打造智能实验学校...
- session的概念
- K8S日常问题-k8s中大量pod 状态 evicted
- 中国宠物用品品牌“Touchdog它它”完成数千万元Pre-A 轮融资
- mathematica入门(一)
- java集合转js数值,基于jsTree的无限级树JSON数据的转换
- 目前流行的个人台式计算机属于,目前个人计算机的主要机型.doc
- 505 php 错误,【WordPress的505错误】
- 版本号semver标准
- Zookeeper系统模型介绍
热门文章
- MYSQL数据库删除数据后重新插入数据 id不连续问题
- 计算机的硬盘有几个区,电脑硬盘应该分几个区比较合适?
- 中柏平板计算机价格,有什么便宜又好用的平板电脑?中柏EZpad i7看下
- 刚入手一台能用充电宝供电的低价大尺寸笔记本电脑——很适合用来当作便携式的远程计算机
- JVM成神路之全面详解执行引擎子系统、JIT即时编译原理与分派实现
- 我的世界服务器精灵模型文件在哪,教你在租赁服里加入小地图、合成表、物品一键整理...
- 一个美国小券商的生存之道Tradestation
- 《强化学习周刊》第60期:BARReL、RL-Mlzerd DeepIndex
- Google:五亿Android设备激活
- 玩转CSS3的3D动画效果