伸展树介绍

假想这么一种情况,我们想要对一个二叉查找树执行一系列的查找操作,为了使整个查找时间更短,那些查频率比较高的节点就应该经常处于比较靠近树根的位置,于是最直观的想法就是将每次查找访问的节点都放到树根处,这样再次查找该节点时将会很快的找到该节点。在每次查找访问节点之后对该树进行重构,将被查找的节点搬移到树根,这种自调整型式的二叉查找树就是splay tree(伸展树),它会沿着从某个被访问节点到树根之间的路径,通过一系列的旋转把这个被访问节点搬移到树根。

伸展树通过一系列的旋转把当前被访问节点搬移到树根,以便下次再次访问该节点时速度极快(直接访问根节点就被命中或离树根很近的位置)。为了将当前被访问节点搬移到树根,我们需要沿着查找路径做自底向上的旋转,直至该节点成为树根为止(伸展树定义的旋转是成对进行的,伸展操作不单是把当前被访问节点搬移到树根,而且还把查找路径上的每个节点的深度都大致减掉一半。)。(假设当前被访问节点为X,X的父亲节点为P(如果X的父亲节点存在),X的祖父节点为G(如果X的祖父节点存在))
每一旋转步骤都是下列三种情况之一:
1.    第一种情况:如果P是树根,则旋转连接X和P的边(这种情况是最后一步)。(如果X是左儿子就右旋,如果X是右儿子就左旋)
2.    第二种情况:如果P不是树根,而且X和P本身都是左孩子或者都是右孩子,则先旋转连接P和G的边,然后再旋转连接X和P的边。
3.    第三种情况:如果P不是树根,而且X是左孩子,P是右孩子,或者相反,则先旋转连接X和P的边,再旋转连接X和新的P的边。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值