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

二叉排序树的结构声明

二叉排序树的创建

二叉排序树的节点删除


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

二叉排序树的结构声明

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;
}

实现效果

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

  1. HTML——全网VIP影视解析单页源码 自适应

    文章目录[隐藏] 全网VIP影视解析单页源码+自适应 全网VIP影视解析单页源码+自适应 上传源码到服务器,访问即可使用,无需数据库,php版本没有限制 为了界面美观,不添加播放器,跳转到解析接口页面 ...

  2. KeePass全网最详使用指南(附全平台个人收集官网的软件)

    KeePass全网最详使用指南(附全平台个人收集官网的软件) 前言: keepass全平台个人收集官网的 下载地址 访问密码:4510) 郑重警告:请不要下载和使用任何非官方来源的KeePass应用程 ...

  3. 基于vc的freetype字体轮廓解析_2020款丰田坦途功能详解析 价格下调折扣多_搜狐汽车...

    本文车型速览 × 除了文章作者的主观观点外,我们正尝试基于全网可查的客观数据,为您提供中立.客观的参考依据: 本文部分车型速览: 畅销车型质量排行top10 展开 × 微信扫码,直接一次看完附近所有城 ...

  4. python清空集合_python集合删除多种方法详解

    这篇文章主要介绍了python集合删除多种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 删除指定的元素 A={'a','c','b','d ...

  5. 折半查找和二叉排序树的时间性能_详解二叉排序树(基础篇)

    前言 我们的线性表有2种,无序线性表和有序线性表. 无序线性表正如其名,它里面的数据是无序的,因为这个表不用维护什么东西,所有它的插入和删除操作的效率也不错..但是,正因为他是无序的,查找起来就很废时 ...

  6. 数据结构笔记(三十四)二叉排序树的删除

    二叉排序树的删除 一.二叉排序树的删除情况 1.被删除的结点是叶子结点 2.被删除的结点只有一个孩子 3.被删除的节点有两个孩子 二.伪代码实现 三.算法性能分析

  7. Java中List集合的三种遍历方式(全网最详)

    Map集合:链接: Map集合的五种遍历方式及Treemap方法 Set集合:链接: Java中遍历Set集合的三种方法 TreeSet集合:链接: Java深入了解TreeSet,和迭代器遍历方法 ...

  8. pandas 如何删掉第一行_pandas删除指定行详解

    pandas删除指定行详解 在处理pandas的DataFrame中,如果想像excel那样筛选,只要其中的某一行或者几行,可以使用isin()方法来实现,只需要将需要的行值以列表方式传入即可,还可传 ...

  9. Class -- 03 -- Random类常用方法详解析

    原文链接:Class – 03 – Random类常用方法详解析 相关文章: Class – 01 – System类常用方法解析 Class – 02 – Arrays类常用方法解析 Class – ...

最新文章

  1. 任务管理器taskmgr查看几核
  2. JAVA调用C语言程序
  3. WORD给文档设置密码保护?
  4. GAOT工具箱设置交叉概率和变异概率
  5. 八:Webpack的加载器
  6. 云队友丨张朝阳不再狂妄,搜狐的艰难复苏路
  7. h5 标签video和audio标签的下载按钮
  8. java中string.length_Java 中的String length() 方法
  9. 组合数问题(NOIP2016提高组Day2T1)
  10. fasttext文本分类python实现_一个使用fasttext训练的新闻文本分类器/模型
  11. 每日新闻:华为获首个微模块产品PUE测试证书;Linux发布Acumos AI开源架构平台;商汤技联手华侨城中学打造智能实验学校...
  12. session的概念
  13. K8S日常问题-k8s中大量pod 状态 evicted
  14. 中国宠物用品品牌“Touchdog它它”完成数千万元Pre-A 轮融资
  15. mathematica入门(一)
  16. java集合转js数值,基于jsTree的无限级树JSON数据的转换
  17. 目前流行的个人台式计算机属于,目前个人计算机的主要机型.doc
  18. 505 php 错误,【WordPress的505错误】
  19. 版本号semver标准
  20. Zookeeper系统模型介绍

热门文章

  1. MYSQL数据库删除数据后重新插入数据 id不连续问题
  2. 计算机的硬盘有几个区,电脑硬盘应该分几个区比较合适?
  3. 中柏平板计算机价格,有什么便宜又好用的平板电脑?中柏EZpad i7看下
  4. 刚入手一台能用充电宝供电的低价大尺寸笔记本电脑——很适合用来当作便携式的远程计算机
  5. JVM成神路之全面详解执行引擎子系统、JIT即时编译原理与分派实现
  6. 我的世界服务器精灵模型文件在哪,教你在租赁服里加入小地图、合成表、物品一键整理...
  7. 一个美国小券商的生存之道Tradestation
  8. 《强化学习周刊》第60期:BARReL、RL-Mlzerd DeepIndex
  9. Google:五亿Android设备激活
  10. 玩转CSS3的3D动画效果