查找算法【平衡二叉树】 - 平衡二叉树的删除
查找算法【平衡二叉树】 - 平衡二叉树的删除
在平衡二叉树中进行插入操作时只需从插入节点之父向上检查,发现不平衡便立即调整,调整一次平衡即可;而进行删除操作时需要一直从删除节点之父向上检查,发现不平衡便立即调整,然后继续向上检查,直到树根。
【算法步骤】
① 在平衡二叉树中查找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.由3位科学家共同发明,用他们首字母命名 又被称为AVL树.从平衡二叉树的名称,你也可以体会到它是一种高度 ...
- 减治法在查找算法中的应用(JAVA)--二叉查找树的查找、插入、删除
减治法在查找算法中的应用 二叉查找树的查找与插入: 二叉排序树或者是一棵空树,或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于或等于它的根节点的值: (2)若右子树不空, ...
- 3374——数据结构实验之查找二:平衡二叉树
数据结构实验之查找二:平衡二叉树 ( LL RR LR RL) Problem Description 根据给定的输入序列建立一棵平衡二叉树,求出建立的平衡二叉树的树根. Input 输入一组测试数据 ...
- SUTD OJ 数据结构实验之查找二:平衡二叉树
数据结构实验之查找二:平衡二叉树 Time Limit: 400 ms Memory Limit: 65536 KiB Submit Statistic Problem Description 根据给 ...
- 查找算法【二叉查找树】 - 二叉查找树的删除
查找算法[二叉查找树] - 二叉查找树的删除 首先要在二叉查找树中找到待删除节点,然后执行删除操作. 假设指针p 指向待删除节点,指针f 指向p 的双亲节点.根据待删除节点所在位置的不同,删除操作的处 ...
- 数据结构-常用的查找算法
总第124篇/张俊红 本篇讲讲数据结构里面常用的几个查找算法,数据结构理论篇系列差不多接近尾声了,接下来会分享一些比较特殊的概念,比如KMP.郝夫曼树等等,讲完概念以后会进入刷题阶段.刷题会用Pyth ...
- 经典查找算法及其Python实现
上一篇介绍了几大排序算法,从基本原理解释到Python代码实现,平时有空的话还需要经常翻出来复习复习.今天就主要来看看另外一大类算法:经典查找算法. 参考资料: <大话数据结构>.< ...
- Re:从零开始的DS学习之查找算法
Re:从零开始的DS学习 考研专业课满分大佬是怎么学习查找算法的,本文从顺序查找->二分查找>hash查找->BST树->优先队列->堆,帮你打开查找算法的新世纪,深入浅 ...
最新文章
- Spring集成TestNg测试
- 内核知识第八讲,PDE,PTE,页目录表,页表的内存管理
- 【Mongodb】MongoDB
- 【C】关于main()函数参数的问题;
- RabbitMq入门以及使用教程
- 转:在eclipse中搭建maven工程(第二种方法)
- 光纤收发器的选购原则介绍
- InputStreamReader 和 OutputStreamWriter类使用方法简单介绍,及演示。
- eclipse设置内存参数 堆内存溢出
- 为什么CSDN登陆是明文传输账户密码
- Linux调用Windows指纹识别,生物识别--指纹识别用于web登录
- 20181113-1 版本控制报告
- Ubuntu下图片转pdf和pdf合并
- 云原生之容器编排实践-Kubernetes资源管理:标签选择器,注解以及命名空间
- 白盒测试之逻辑覆盖准则
- 微信小程序突然多了好多动态_让微信小程序的登陆页面有云朵悬浮的动态效果...
- 我犯了一个低级的C++的逻辑错误
- 全屋智能--智慧家庭新风向
- Hisi3516交叉编译ffmpeg支持h264编码
- 连续时间的马尔可夫链