您的位置:首页 > 编程语言 > Java开发

红黑树的插入删除算法的实现(java描述)

2008-01-26 11:15 711 查看



实验目的:

熟悉红黑树的性质,使用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]是红
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: