红黑树
红黑树是一种二叉搜索树,可以保证树得查找、插入、删除得时间复杂都为O(lgn)
红黑树有重要得三个性质:
1、根结点的颜色为黑色
2、父、子结点不能同时为红色
3、对每个结点,从该结点出发到其后代的叶结点路径,均包含相同数目的黑色结点
树的旋转
首先定义旋转,后面的插入和删除操作都需要用到旋转操作,旋转分为左旋和右旋
如图所示,左边图右旋x结点,可以得到右图。右图左旋y结点可以得到左图
红黑树的插入操作
红黑树的插入操作相对于删除操作较为简单,创建一个新结点 z z z,进行相应赋值,并将其染成红色。
首先通过搜索找到插入的位置。分为两种情况
-
新插入的结点 z z z为根结点 (解决方法:将根结点染黑即可)
新插入的结点 z z z的父结点为黑色 (不用任何操作)
-
新插入的结点 z z z的父结点为红色(违反前面所述性质2)
可以分为三种情况对红黑树进行修复
红黑树的删除操作
红黑树的删除操作较为复杂。删除的节点分为几种情况
-
删除节点是叶节点直接删除就好
-
删除的节点只有一个子节点,删除节点,并且由子节点占据删除节点位置
-
删除的节点既有左节点、又有右节点,找到节点中序遍历的直接后缀或直接前缀
z是需要删除的节点,y是其直接前缀,x是y的左节点
删除z节点,y节点替换z节点,x替换y节点
-
删除节点如果是黑色,必须在其原位置添加一层黑色,如果替换节点是红色,简单得去除一层红色,就可以解决,如果替换节点是黑色,成为双黑色,需要去除多余的黑色
去除多余得黑色,可以分为四种情况