1 每一个节点不是黑色的就是红色的
2 根节点是黑色
3 从根节点出发到每一个叶节点的路径上全部黑色节点的数量相等
4 每一个NULL节点当作黑色的节点
5 红色节点的两个子节点都是黑色的设计
已经有了AVL平衡树,为何还须要设计出一个红黑树。
由于红黑插入比AVL快,快的缘由是,它可能会比AVL树多一层,因此须要的处理就少一些,可是它查找可能要比AVL多一次搜索过程。3d
前提:插入的节点都是红色的节点。若是父节点是黑色的,直接插入成功。其他的分如下几种状况blog
父节点是红色的,叔父节点也是红色的,这种状况不须要区分,当前节点是父节点的左节点仍是右节点,处理逻辑是同样的。
搜索
如上图,咱们插入一个节点33, 违背规则5,将父节点与叔父节点涂黑,以后违背规则3,将祖父节点涂红,结果以下图im
这个时候进入第二种状况d3
父节点是红色的,叔父节点是黑色的,这里又有两种状况,分父节点是祖父节点的左节点仍是右节点。db
这里又分2种状况,当前节点是父节点的左节点和右节点。img
这种状况须要旋转,与AVL树的旋是同样的。 以父节点30为顶端,进行左旋,左旋后的结果以下图:红黑树
这个时候以当前节点30的祖父节点为顶端,进行右旋。旋转前,须要将祖父节点67涂红,父节点40涂黑,以符合规则3。
co
不讨论这种状况,与上面是对称的。
删除的状况最多三次能够平衡,若是删除的是红色节点,直接完成删除动做,其它分如下几种状况
以下图:
当删除节点30的时候,先找30的后继(注意还有前驱的概念)节点,而后用后继节点替换掉30节点,以下图:
用X代替30,X是空节点,这里又分2种状况,X是父节点的左节点仍是右节点,咱们这里只讨论右节点的状况,左节点是对称的。 将X的兄弟节点涂黑,X的父节点涂红,以X的父节点为顶端进行右旋,结果以下图:
设Y为X的兄弟节点,这个时侯有如下三种状况:
这个时候只须要将Y涂为红色,X的父节点涂为黑色。
这个时侯须要旋转,将Y的右节点变为黑色,缘由是Y自己也是红色,最终确定是须要右旋的,这个时候Y的右节点会变为Y的父节点的左节点,会形成红红冲空。 将25涂红,26涂黑,以25为顶端进行左旋:以下图:
进入Y的左节点为红色的状况
将Y的左节点25涂黑,Y26涂红,X的父节点40涂黑,右旋,以下图: