免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7288 | 回复: 13
打印 上一主题 下一主题

[算法] 求AVL平衡树删除操作的过程分析和实例程序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-12-06 15:18 |只看该作者 |倒序浏览
只能按照严魏敏的<<数据结构>>绿皮课本上讲的插入操作,但删除操作不会,请求实现过的大侠的帮助
谢谢!

论坛徽章:
0
2 [报告]
发表于 2007-12-06 15:19 |只看该作者
我记得yping写过一个吧 你搜索一下 就在C版里.

论坛徽章:
0
3 [报告]
发表于 2007-12-06 15:43 |只看该作者
俺的名字是ypxing(Yunpeng Xing), 呵呵

http://bbs.chinaunix.net/viewthread.php?tid=1011237

详细分析,推荐你看一下:
<<Data Structures, Algorithms, and Applications ini C++>>

[ 本帖最后由 ypxing 于 2007-12-6 15:48 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2007-12-06 16:22 |只看该作者
非常感谢两位
我在google里怎么搜怎么都没搜到ypxing大侠的帖子了,怪了,郁闷了

记得以前CU关闭了论坛搜索功能吧,所以只会到google上了

[ 本帖最后由 augustusqing 于 2007-12-6 16:26 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2007-12-06 17:07 |只看该作者

论坛徽章:
0
6 [报告]
发表于 2007-12-06 17:42 |只看该作者
原帖由 albcamus 于 2007-12-6 17:07 发表
http://bbs.chinaunix.net/viewthread.php?tid=692071


多谢!

艾,没有理论上过程的分析与理解,读代码好吃力哦

论坛徽章:
0
7 [报告]
发表于 2007-12-07 08:45 |只看该作者
LZ有前途,我很看好你哦~

论坛徽章:
0
8 [报告]
发表于 2007-12-07 11:06 |只看该作者
由于工作需要,这段时间一直在接触AVL树,不过需求是需要插入,不用删除,所以对删除操作也不是非常熟悉。
不过查过一些删除方面的资料,了解一些,删除其实并不比插入难多少,只要真正理解了插入是怎么一回事,就能明白删除了,相信楼主的能力。
随便说一下,AVL树做排重、查找等方面确实非常不错。

论坛徽章:
0
9 [报告]
发表于 2007-12-07 11:11 |只看该作者
现在一般用红黑树

论坛徽章:
0
10 [报告]
发表于 2007-12-07 12:26 |只看该作者
说一下我以前想过的一个方法:
删除可以分两种情况来讨论:1.要删除节点是叶节点;2.要删除节点不是叶节点。

1。是叶节点的情况
        假设要删除的节点为T。这种情况可以直接删除此节点。需要注意的是,如果T有父节点(即avl树不是一棵只有单个节点的树),需要将T的父节点中指向T的指针置为0。如果删除T节点导致其父节点不再平衡,需要调整其父节点(也就是旋转)。这种调整可能一直持续到根节点。

2。不是叶节点的情况
        假设要删除的节点为T。删除的思路是:
a. 找到T的左子树的最右节点或者右子树的最左节点,记为T1。
b. 将T1的数据值赋给T。
c. 判断T1是否为叶节点。如果是,设置其父节点的指针;否则,T1一定是下面两种情况。

        这时可以将T2的各中信息都复制给T1。相当于T2上移至T1的位置,同时删除T1。
d. 判断T1的父节点是否平衡,如果不平衡则需要调整父节点。这种调整也可能一直持续到根结点。

实现方式:
        因为删除一个节点可能导致对其祖先结点的旋转,因此可以事先将要节点的祖先节点都保存下来。也就是从根结点到T1节点的路径。调整的时候是从T1的父节点开始往山(可能持续到根节点),因此其路径适合保存在栈中。这样可以依次从栈中弹出节点,判断是否需要调整。
        需要注意的是,如果T1不是叶节点,需要查找其左子树的最右节点或者右子树的最左节点T2,这时的调整是从T2的父节点开始的,因此还需要记录T1到T2的路径,也就是说,最终得到的路径是从根结点到T2的。
        调整某个节点的时候,记此节点为Tc,假设其父节点为Tp。需要将Tp的左(或者右)子树指针指向调整后得到的新Tc。

        这只是思路, 以前写过一个代码,可以看下面的连接. 不过没有经过严格测试. 说不定有什么问题.

不知道怎么直接添加图片,可以看这里http://www.cppblog.com/lucency/archive/2007/09/28/33098.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP