二叉树
数据结构: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父节点的父节点的父节点指针指向的位置。最后改变相应颜色