您的位置:首页 > 其它

红黑树(二叉搜索树的一种)

2015-04-11 21:11 183 查看
满足如下性质:
每个结点或是红色的,或是黑色的
根结点是黑色的
每个叶节点(NIL)都是黑色的
如果一个结点是红色的,则其两个子结点都是黑色的
对每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点

——>确保没有一条路径会比其他路径长出两倍,是近似于平衡的
一棵有n个内部结点的红黑树的高度至多为2 lg(n+1)

树操作TREE-INSERT和TREE-DELETE会对树做了修改,为了维持这些性质,必须要改变树中某些结点的颜色以及指针结构
修改指针结构通常通过旋转(左旋和右旋)来完成
LEFT-ROTATE(T, x)【涉及到x, y】
y = x.right
x.right = y.left
if y.left != T.nil //如果y的左孩子不是空的,则它变为x的右孩子后,需要修改它的父亲结点
y.left.p = x
y.p = x.p
if x.p == T.nil //如果一开始x是根结点
T.root = y
elseif x == x.p.left //修改x的父亲结点的后继
x.p.left = y
else
x.p.right = y
y.left = x
x.p = y

插入
1. 同二叉搜索树的插入一样,找到插入的位置,但是可能破坏红黑树的性质,因此需要调整回来
2. 调整恢复红黑树的性质,称插入的结点为z
1) z的叔结点y是红色的,则将z结点的父结点和叔结点都改成黑色;并将z上升至z的父结点的父结点
2) z的叔结点y是黑色的且z是一个右孩子,先做一次左旋转,将z转换为左孩子,从而进入第3)种情况
3) z的叔结点y是红色的且z是一个左孩子,做一次右旋转
总的时间复杂度为O(lg n)

删除比插入复杂一点,这里就不多讲了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: