JAVA 红黑树

红黑树的性质

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的左右子节点都为黑色

这个时候只须要将Y涂为红色,X的父节点涂为黑色。

Y的右节点为红色

这个时侯须要旋转,将Y的右节点变为黑色,缘由是Y自己也是红色,最终确定是须要右旋的,这个时候Y的右节点会变为Y的父节点的左节点,会形成红红冲空。 将25涂红,26涂黑,以25为顶端进行左旋:以下图:

进入Y的左节点为红色的状况

Y的左节点为红色

将Y的左节点25涂黑,Y26涂红,X的父节点40涂黑,右旋,以下图:

相关文章
相关标签/搜索