查找算法【平衡二叉树】 - 平衡二叉树的删除

在平衡二叉树中进行插入操作时只需从插入节点之父向上检查,发现不平衡便立即调整,调整一次平衡即可;而进行删除操作时需要一直从删除节点之父向上检查,发现不平衡便立即调整,然后继续向上检查,直到树根。

【算法步骤】

① 在平衡二叉树中查找x ,如果查找失败,则返回;如果查找成功,则执行删除操作(同二叉查找树的删除操作)。

② 从实际被删除节点之父g 出发(当被删除节点有左右子树时,令其直接前驱(或直接后继)代替其位置,删除其直接前驱,实际被删除节点为其直接前驱(或直接后继)),向上寻找最近的不平衡节点。逐层检查各代祖先节点,如果平衡,则更新其高度,继续向上寻找;如果不平衡,则判断失衡类型(沿着高度大的子树判断),并做相应的调整。

③ 继续向上检查,一直到树根。

【举个栗子】

例如,一棵二叉平衡树如下图所示,删除16。

① 16为叶子,将其直接删除即可,如下图所示。

② 指针g 指向实际被删除节点16之父25,检查是否失衡,25节点失衡,用g 、u 、v 记录失衡三代节点(从失衡节点沿着高度大的子树向下找三代),判断为RL型,进行RL旋转调整平衡,如下图所示。

③ 继续向上检查,指针g 指向g 的双亲69,检查是否失衡,69节点失衡,用g 、u 、v 记录失衡三代节点,判断为RR型,进行RR旋转调整平衡,如下图所示。

④ 已检查到根,结束。

【再一个栗子】

一棵平衡二叉树如下图所示,删除80。

① 80的左右子树均非空,令其直接前驱78代替它,删除其直接前驱78,如下图所示。

② 指针g 指向实际被删除节点78之父75,检查是否失衡,75节点失衡,用g 、u 、v 记录失衡三代节点,判断为LL型,进行LL旋转调整平衡,如下图所示。

③ 指针g 指向g 的双亲80,检查是否失衡,一直检查到根,结束。

注意: 从实际被删除节点之父开始检查是否失衡,一直检查到根。

【算法实现】

AVLTree adjust(AVLTree &T){ //删除节点后,需要判断是否仍平衡,如果不平衡,则需要调整if(T == NULL){return NULL;}if(Height(T->lchild) - Height(T->rchild) == 2){ //沿着高度大的那条路径判断if(Height(T->lchild->lchild) >= Height(T->lchild->rchild)){T = LL_Rotation(T);}else{T = LR_Rotation(T);}}if(Height(T->rchild) - Height(T->lchild) == 2){ //沿着高度大的那条路径判断if(Height(T->rchild->rchild) >= Height(T->rchild->lchild)){T = RR_Rotation(T); }else{T = RL_Rotation(T);}}updateHeight(T);return T;
}AVLTree Delete(AVLTree &T , int x){if(T == NULL){return NULL;}if(T->data == x){ //如果找到待删除节点if(T->rchild == NULL){ //如果该节点的右孩子为NULL,那么直接将其删除AVLTree temp = T;T = T->lchild;delete temp;     }else{ //否则,将其右子树的最左孩子作为这个节点,并且递归删除这个节点的值AVLTree temp;temp = T->rchild;while(temp->lchild){temp = temp->lchild;}       T->data = temp->data;T->rchild = Delete(T->rchild , T->data);updateHeight(T);}return T;}if(T->data > x){ //调整删除节点后可能涉及的节点T->lchild = Delete(T->lchild , x);}if(T->data < x){T->rchild = Delete(T->rchild , x);}updateHeight(T);T = adjust(T);return T;
}

查找算法【平衡二叉树】 - 平衡二叉树的删除相关推荐

  1. 查找算法【平衡二叉树】 - 平衡二叉树的创建

    查找算法[平衡二叉树] - 平衡二叉树的创建 平衡二叉树的创建和二叉查找树的创建类似,只是插入操作多了调整平衡而已. 可以从空树开始,按照输入关键字的顺序依次进行插入操作,最终得到一棵平衡二叉树. [ ...

  2. 数据结构与算法——图解平衡二叉树及代码实现

    平衡二叉树介绍 平衡二叉树,是一种二叉排序树,其中每一个节点的左子树和右子树的高度差最多等于1.由3位科学家共同发明,用他们首字母命名 又被称为AVL树.从平衡二叉树的名称,你也可以体会到它是一种高度 ...

  3. 减治法在查找算法中的应用(JAVA)--二叉查找树的查找、插入、删除

    减治法在查找算法中的应用 二叉查找树的查找与插入: 二叉排序树或者是一棵空树,或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于或等于它的根节点的值: (2)若右子树不空, ...

  4. 3374——数据结构实验之查找二:平衡二叉树

    数据结构实验之查找二:平衡二叉树 ( LL RR LR RL) Problem Description 根据给定的输入序列建立一棵平衡二叉树,求出建立的平衡二叉树的树根. Input 输入一组测试数据 ...

  5. SUTD OJ 数据结构实验之查找二:平衡二叉树

    数据结构实验之查找二:平衡二叉树 Time Limit: 400 ms Memory Limit: 65536 KiB Submit Statistic Problem Description 根据给 ...

  6. 查找算法【二叉查找树】 - 二叉查找树的删除

    查找算法[二叉查找树] - 二叉查找树的删除 首先要在二叉查找树中找到待删除节点,然后执行删除操作. 假设指针p 指向待删除节点,指针f 指向p 的双亲节点.根据待删除节点所在位置的不同,删除操作的处 ...

  7. 数据结构-常用的查找算法

    总第124篇/张俊红 本篇讲讲数据结构里面常用的几个查找算法,数据结构理论篇系列差不多接近尾声了,接下来会分享一些比较特殊的概念,比如KMP.郝夫曼树等等,讲完概念以后会进入刷题阶段.刷题会用Pyth ...

  8. 经典查找算法及其Python实现

    上一篇介绍了几大排序算法,从基本原理解释到Python代码实现,平时有空的话还需要经常翻出来复习复习.今天就主要来看看另外一大类算法:经典查找算法. 参考资料: <大话数据结构>.< ...

  9. Re:从零开始的DS学习之查找算法

    Re:从零开始的DS学习 考研专业课满分大佬是怎么学习查找算法的,本文从顺序查找->二分查找>hash查找->BST树->优先队列->堆,帮你打开查找算法的新世纪,深入浅 ...

最新文章

  1. Spring集成TestNg测试
  2. 内核知识第八讲,PDE,PTE,页目录表,页表的内存管理
  3. 【Mongodb】MongoDB
  4. 【C】关于main()函数参数的问题;
  5. RabbitMq入门以及使用教程
  6. 转:在eclipse中搭建maven工程(第二种方法)
  7. 光纤收发器的选购原则介绍
  8. InputStreamReader 和 OutputStreamWriter类使用方法简单介绍,及演示。
  9. eclipse设置内存参数 堆内存溢出
  10. 为什么CSDN登陆是明文传输账户密码
  11. Linux调用Windows指纹识别,生物识别--指纹识别用于web登录
  12. 20181113-1 版本控制报告
  13. Ubuntu下图片转pdf和pdf合并
  14. 云原生之容器编排实践-Kubernetes资源管理:标签选择器,注解以及命名空间
  15. 白盒测试之逻辑覆盖准则
  16. 微信小程序突然多了好多动态_让微信小程序的登陆页面有云朵悬浮的动态效果...
  17. 我犯了一个低级的C++的逻辑错误
  18. 全屋智能--智慧家庭新风向
  19. Hisi3516交叉编译ffmpeg支持h264编码
  20. 连续时间的马尔可夫链

热门文章

  1. 网上赚钱第一步是借鉴与学习
  2. HarmonyOS实战—Text组件宽高三种值的写法和颜色属性
  3. windows 查找目录下文件中包含某个字符的文件
  4. 行数据上加一个version版本字段,可以有效防止数据重复更新
  5. 桌面ICON的红图标
  6. GlassFish主配置文件domain.xml介绍
  7. 【180718】FC经典坦克大战源码
  8. 2022年江苏专转本计算机大类考生经验分享(上岸南工程)
  9. JavaScript中的对象的属性名和属性值
  10. mybatis 的加载过程