实验目的:

       熟悉红黑树的性质,使用java语言实现红黑树的插入删除算法,并测试实现的算法。

问题定义

       尝试构造一个红黑树。实现红黑树的定义,并且实现其插入删除的算法。插入或者删除某个元素之后扔保持红黑树的性质。

       可依次插入下列数组中的元素:{41,12,8,7,3,9,10,11,56,29,33,43}

       打印该红黑树。

       删除元素10,9,再次打印该红黑树。

实验思想

红黑树:

1)        每个结点或是红的,或是黑的
2)        根结点是黑的
3)        每个叶结点(NIL)是黑的
4)        如果一个结点是红的,那么它的2个儿子是黑的。
5)        对每个结点,从该结点到其子孙结点的所有路径上包含相同数目的黑结点。

结点插入部分:

 思想:与平衡二叉树相同 

伪码:

RBInsert(T, z)
{ y ← nil[T]; //y用于记录:当前扫描节点的双亲节点
x ← root[T]; //从根开始扫描
while x ≠ nil[T] do //查找插入位置
{ y ← x;
if key[z] < key[x] then //z插入x的左边
x ← left[x];
else
x ← right[x]; //z插入x的右边
}
p[z] ←y; //y是z的双亲
if y = nil[T] then //z插入空树
root[T] ←z; //z是根
else
if key[z] < key[y] then
left[y] ← z; //z是y的左子插入
else
right[y] ←z; //z是y的右子插入
left[z] ← right[z] ← nil[T];
color[z] ← red;
RBInsertFixup(T, z);// 调整(z上溯),使树T满足红黑树
}

调整部分:

思路:

以2叉搜索树的方式查找可以插入该结点的位置,插入该结点。然后通过旋转和改变颜色,自下而上调整(该结点z进行上溯),使树满足红黑树; 

框架:

可能违反性质2:z是根

可能违反性质4:p[z]是红