高级数据结构(一)

.自顶向下伸展树

伸展树考虑到局部性原理,为使整个查找时间更小,将被频繁查找的节点调整到根部,即通过不断改变树的结构,从而使其的操作保持了O(logN)的摊还时间界。

伸展树的单旋转、一字形旋转和之字形旋转的旋转示意图如下,

 

1-1 伸展树的单旋转、一字形旋转和之字形旋转的展开旋转示意图

在执行完最后一步的展开后,需要对L、R以及中间树进行合并,形成单一的树,合并的示意图如下

1-2 伸展树执行完伸展后的合并

伸展树的自顶向下的展开代码如下,

1-3 伸展树自顶向下的展开代码

伸展树将最近搜索的节点放在最容易搜索的根节点的位置,让其在许多环境中得到应用,比如网络应用中,某些固定内容会被大量重复访问。伸展树可以让这种重复搜索以很高的效率完成。

.红黑树

红黑树是一种自平衡二叉查找树,和AVL树类似,都是在进行插入和删除操作时通过特定操作使树保持平衡,从而获得较高的查找性能。

红黑树的特性:

(1) 每个节点或者是黑色,或者是红色。

(2) 根节点是黑色。

(4) 如果一个节点是红色的,则它的子节点必须是黑色的。

(5) 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

2-1 常规的红黑树

在红黑树上查找操作不需要对其修改,但在插入和删除操作中,红黑树的性质可能遭到破坏,需要恢复红黑属性,不过其插入和删除的操作的时间复杂度仍为O(log n),但是这些操作却有些复杂。

红黑树的插入和删除可以与伸展树以自顶向下的方式进行。

设当前节点为Current,其兄弟节点为Brother,父节点为Parent,祖父节点为Grand,曾祖父为Great(空节点的默认颜色是黑色)。

在自顶向下的插入过程中,若Current节点有两个红孩子时,进行颜色翻转(使Current为红,其两孩子为黑,不管Current是否为根,都令根为黑)。

颜色翻转后,若Current的父节点Parent为红,则进行旋转。

自顶向下的插入操作实现代码如下,

2-2 红黑树自顶向下的插入过程

在自顶向下的删除过程中,与AVL树同样将删除非叶子节点转换为删除叶子节点,具体过程如下

第一步,检查根,并将根变为红色,

1. 若根有两个黑儿子,向下并进入第二步

2. 其他则进入第二步B情况

第二步,

A情况,当前节点Current有两个黑儿子

A1.兄弟节点Brother节点也有两个黑儿子,翻转Current、Parent和Brother节点的颜色,向下(示意图如下)

2-3 红黑树自顶向下删除A1的情况

A2.兄弟节点Brother节点的左儿子为红,进行之字形旋转,并翻转Current和Parent颜色,向下(示意图如下)

2-4 红黑树自顶向下删除A2的情况

A3.兄弟节点Brother节点的右儿子为红,进行一字形旋转,并翻转Current、Parent、Brother和Brother右儿子节点的颜色,再向下(示意图如下)

2-5 红黑树自顶向下删除A3的情况

B情况,当前节点Current至少有一个红儿子,

Current节点继续向下,若新的Current节点为红,继续向下。若新的Current节点为黑,则单旋转Brother节点和Parent节点,同时翻转Brother和Parent节点,回到第二步;

第三步,最终找到要删除节点,这是一个叶节点,将节点以红节点身份删除,否则转换为删除叶子节点;

第四步,将根恢复为黑色。

 

posted @ 2019-07-06 10:31  lincoding`  阅读(1156)  评论(0编辑  收藏  举报