您的位置:首页 > 其它

STL源码剖析学习九:树

2012-04-23 16:32 239 查看
STL源码剖析学习九:树

二叉搜索树:可以提供对数时间的元素插入和访问。
元素放置规则:任何节点的键值一定大于其坐子树的每个节点的键值,并且小于其右子树中的每一个节点的键值。

插入新元素时,从根节点开始,遇到键值较大者就向左,遇到键值较小者就向右,一直到尾端。
删除:如果A只有一个子节点,就直接将该子节点连接到A的父节点上。
如果A有两个子节点,就用右子树内最小的节点取代A(右子结点向左走一直到底就是)。

平衡二叉搜索树:
没有一个节点过深,避免了因为树的大幅不平衡而导致的搜索时间延长的情况。

AVL tree:
加上了额外的平衡条件:任何节点的左右子树高度相差最多为1,保证对数深度的平衡条件。
当插入元素时,只有插入点至根节点的路径上的各个节点可能改变平衡状态,因此只要调整其中最深的那个点就可以使树

重新平衡。

插入点位于坐子节点的左子树或者右子结点的右子树称为外侧插入。用单旋转解决
插入点位于坐子节点的右子树或者右子结点的左子树称为内侧插入。用双旋转解决
(具体的不画了,懒。。。。。。。。)

RB-tree红黑树:
SGI STL唯一实现的一种搜索树,作为关联式容器的底部机制实现。

红黑树必须满足以下规则:
1.每个节点不是红色就是黑色
2.根节点必须是黑色
3.如果子节点为红,其子节点必须为黑
4.任意节点到树尾端的任何路径,所含节点中的黑色节点数必须相同
(这个描述跟算法导论的描述不太一样,不过原则上没有区别,还是看算法导论的吧)

根据规则4,新增节点必须为红,根据规则3,新增节点的父节点必须为黑。当新插入的节点未能符合上述条件时,就需要

调整颜色并且旋转树形。

当G节点为黑时,直接插入X不会引起树形的不平衡。
只有G节点为红时才可能需要调整。

根据x的插入位置和S(叔叔节点)及GG(祖父节点)的颜色,有以下几种情况:
1.S为黑且X为外侧插入,对此情况,先对PG做一次单旋转,并改变PG颜色即可
2.S为黑且X为内侧插入,对此情况,先对PX做一次单旋转,并改变XG颜色,再将结果对G做一次单旋转即可
3.S为红时,G的两个子节点都为红,用一种由上而下的方法调整:
假设新节点为A就沿着A的路径,只要看到某节点X的两个子节点都为红色,就改变X及其两个子节点的颜色。
但是如果X的父节点P亦为红色(此时S不可能为红色),就要像1或者2一样做旋转并且改变颜色。
此时再插入新的节点就可以直接插入,或者在插入后再做一次调整。
(图又懒了。。。。)

本书上的插入操作跟算法导论上讲的分类有区别,但是操作没区别。而且本书上没有讲删除操作,还需要研究一下。

发现一个很好的讲红黑树的博客,留下来可以参考下
http://blog.csdn.net/v_JULY_v/article/details/6105630
http://blog.csdn.net/v_JULY_v/article/details/6285620
http://blog.csdn.net/v_JULY_v/article/details/6284050
http://blog.csdn.net/v_JULY_v/article/details/6124989
http://blog.csdn.net/v_JULY_v/article/details/6114226
http://blog.csdn.net/v_JULY_v/article/details/6109153

下一步看红黑树的源码(⊙o⊙)…
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: