目录
红黑树
红黑树
红黑树的定义
红黑树本质是一种二叉查找树,在二叉查找树基础上增加了一个标记。
红黑树的特点
-
每个节点要么是黑色,要么是红色。
-
根节点必须是黑色(在二叉树为空时,一定会违反必须为黑色的规则,必须将数据填充为黑色)。
-
叶子节点为黑色(null用黑色表示)。
(1). Java实现的红黑树将使用null来代表空节点,因此遍历红黑树时看到的叶子结点为红色。
-
如果一个节点为红色,那么子节点必须为黑色。
(1). 根节点到节点的路径上不可以出现两个连续的红色,但黑色是可以连续的。
(2). 若黑色节点的个数为N,最短路径情况为连续N个黑色,树的高度为N-1,最长路径的情况为节点的红黑相间,树的高度为2(N-1)。
-
从一个节点到它的子孙节点的所有路径上包含相同数目的黑节点数量。
(1). 成为红黑树最主要的条件,后序的插入、删除操作都是为了遵守这个规定。
-
图片:
数据的插入处理
-
第一次插入由于二叉树为空,违反红黑树规则2,要把根节点涂黑。
-
插入节点的父节点为黑色没有违反规则,不需要做什么,有三种情况需要旋转和变色:
(1).插入节点的父节点和叔叔节点(爷爷节点的另一个子节点)都为红色。
规则:父节点和叔叔节点变黑,爷爷节点变红。
(2).插入节点的父节点为红色,叔叔节点为黑色,插入节点为父节点左子节点。
规则:父节点变黑,爷爷节点变红,再右旋
(3).插入节点的父节点为红色,叔叔节点为黑色,插入节点为父节点右子节点。
规则:插入节点进行左旋顶替父节点位置,在和根节点互换颜色后进行右旋。
节点数据删除
- 如果删除节点没有子节点直接删除。
-
如果删除节点有一个子节点,直接删掉,用子节点代替。
根节点到节点的路径上不可以出现两个连续的红色,但黑色是可以连续的。
- 如果删除节点两个子节点,要先找出移动节点,处理两个节点之间的关系,在处理移动节点和删除节点的父节点之间的关系,最后处理移动节点的子节点和删除节点的子节点之间的关系。
红黑树数据删除修复处理
-
删除成功后,如果当前节点时黑色的根节点,无须作任何操作。
-
如果当前节点为红色,表示移动节点为黑色,无论移动节点的父节点是什么颜色,将当前节点涂黑,即可恢复正常。
-
遇到下列四种情况,则需要通过变色和旋转来恢复红黑树的平衡:
(1). 当前节点为黑色,兄弟节点(父节点的另一个节点)为红色,那么父节点和兄弟节点的子节点一定为黑色。
规则:当前节点的父节点变黑,兄弟节点变红再左旋。
(2). 当前节点为黑色,兄弟节点(父节点的另一个节点)为黑色,那么兄弟节点的两个子节点都为黑色。
规则:当前节点的兄弟节点变色。
(3). 当前节点为黑色,兄弟节点(父节点的另一个节点)为黑色,且兄弟节点的左子节点为红色,右子节点为黑色。
规则:兄弟节点和兄弟节点的子节点进行右旋,再互换颜色。
(4). 当前节点为黑色,兄弟节点(父节点的另一个节点)为黑色,且兄弟节点的右子节点为红色,右子节点为任意色。
规则:兄弟节点为支点进行左旋,再使兄弟节点和兄弟节点的子节点及当前节点的父节点变色。