《数据结构与算法分析》伸展树(自底向上)详解

前言:

      完成了AVLTree之后,课本又接着讲了伸展树,不过书上就只简单的提及了一下这棵树的特点,并且简单的讲诉了树的伸展操作。没有给出树的定义,也没有给出任何的操作伪代码或者算法流程。在完成了AVLTree之后我信心大增,决定要自行实现这棵树,于是自己在纸上画了画流程图,然后就开始编码了。

结果遇上的第一个问题就是树结构定义上的问题。书本上说伸展树由于每次访问之后会将访问的节点变成根节点,因此不像AVLTree那样需要保存高度信息,节省了储存的空间。但是这样的话,按照课本上给出的旋转方法(需要知道被访问节点的父节点和祖父节点),每次都需要重新遍历一次二叉树确认父亲和祖父节点,那么这样复杂度上升了太多。如果保存一个父亲节点的话,那么和AVLtree不就变得相同了吗?带着这个问题编码,果然编码的一塌糊涂,最后都不知道自己在写什么了可怜,果然要先完全想清楚再开始写代码敲打

然后呢,没辙,只能上网搜一搜别人的博客,看看别人是怎么实现这个问题的吧,阅读了博客之后才发现有两种实现Splay操作的方式,一种是子顶向下,这样的方式最简单,并且不需要保存父节点信息,我将在下一篇博客中叙述。另一种就是书上给出的自底向上了,因为必须要访问父亲节点,所以树成员中一定需要保存父亲节点的指针。

参考的博客:

 自底向上:

http://www.cnblogs.com/vamei/archive/2013/03/24/2976545.html。我从这一篇博客中学习了不少的新的思想,比如我最开始总想着利用一个函数递归完成插入或者删除操作,却发现其中有一部分的操作不是每个节点都需要的,这个时候可以把删除操作再分出一个子函数来,需要递归的部分由这个子函数完成就行了。这样使得编码简单很多并且易于阅读。

自顶向下:

http://www.cnblogs.com/kernel_hcy/archive/2010/03/17/1688360.html 。这一篇博客写的非常的详细,并且给出了贴图详细讲诉旋转的过程,来源是sedgewick大神的《算法》一书。我根据给出的流程图和伪代码,完全理解之后,用一个小时完成了编码,并且一次测试通过。

我的github:

我实现的代码全部贴在我的github中,欢迎大家去参观。

https://github.com/YinWenAtBIT

介绍:

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值