算法导论第12&13章-二叉查找树&红黑树

二叉树

数据结构:left,right,p,即左子树,右子树,父节点

特点:左子树均小于根,右子树均大于根


前趋和后继:中序遍历

求后继:若节点的右子树不为空,则其后继为右子树中最左边的节点、否则其后继为该节点的最低祖先节点(从该节点开始向上找,直到遇到某个节点是其父节点的左儿子的节点为止)


插入:假设树为T,要插入的节点为z,分两种情况考虑

1.T不为空

为z找到适当位置插入即可:while(x != NULL)...

2.T为空

直接插入z


删除:分三种情况考虑

1.z没有子女,直接删除即可

2.z只有一个子女,删除z后用其子女代替其位置即可

3.z有两个子女,则删除其后继y,它至多只有1个子女;接着,用y的关键字和附加数据替换掉z的关键字和附加数据


红黑树

数据结构:color,key,left,right,p,即颜色,键值,左子树,右子树,父节点

特征:

1.每个节点或是红的,或是黑的

2.根节点是黑的

3.每个叶节点是黑的

4.如果一个节点是红的,则它的两个儿子都是黑的

5.对每个节点,从该节点到其子孙节点的所有路劲上包含相同数目的黑节点


操作:

1.旋转

前提:当在某个节点x上做左旋时,我们假设它的右节点y不是nil[T],当在某个节点x上做右旋时,我们假设它的左节点y不是nil[T]。

左旋以x到y之间的链为支轴进行。他使y成为该子树的新的根,x成为y的左孩子,而y的左孩子则成为x的右孩子


2.插入

分两步进行。首先类似于二叉查找树,将要插入的节点z置为红色, 插入适当位置。之后由于红黑树的性质可能会遭到破坏,因此要对其进行调整。

分析红黑树的五个特征,易知其节点的插入有可能导致性质2和4的破坏。其中若被插入的树为空,则性质2被破坏;若插入的节点的父节点为红色,则性质4被破坏。因此要对其进行调整

性质2被破坏:直接改色即可

性质4被破坏:

分三种情况

I.z的叔叔y是红色的

解决方法:将z的叔叔和父节点设为黑色,z的父节点的父节点设为红色,z指向该节点,进行下一轮循环,直到根节点

code:

if(p[z] == left[p[p[z]]])

right[p[p[z]]] = red

else

left[p[p[z]]] = red

p[p[z]] = red

p[z] = black

z=p[p[z]]


II.z的叔叔y是黑色的,z是左孩子

III.z的叔叔y是黑色的,z是右孩子

情况II可通过旋转变为情况III,情况III的解决方法如下:

右旋,将z父节点的父节点作为z的父节点的右子树,z的父节点的父节点指针指向z父节点的父节点的父节点指针指向的位置。最后改变相应颜色


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值