JYM大家好,这里是布洛妮娅, 鸭鸭的更文频道😎,本篇文章是对
红黑树的一个学习记录和总结!!
一、红黑树的性质
红黑树,Red-Black Tree 「RBT」是一个自平衡(不是绝对的平衡)的二叉查找树(BST),树的每个节点都遵循下面的规则:
- 性质1:每个节点要么是黑色,要么是红色.
- 性质2:根节点是黑色.
- 性质3:每个叶子节点(NIL)是黑色.
- 性质4:每个红色结点的两个子结点一定都是黑色.
- 性质5:任意一结点到每个叶子结点的路径都包含数量相同的黑结点.
二、红黑树能自平衡,它靠的是什么?
三种操作:左旋、右旋和变色
- 左旋:以某个结点作为支点(旋转结点),其右子结点变为旋转结点的父结点,右子结点的左子结点变为旋转结点的右子结点,左子结点保持不变.
- 右旋:以某个结点作为支点(旋转结点),其左子结点变为旋转结点的父结点,左子结点的右子结点变为旋转结点的左子结点,右子结点保持不变.
- 娈色:结点的颜色由红变黑或由黑变红.
三、红黑树的插入场景
- 红黑树为空
- 把插入的节点设置为根节点,并设置为黑色
- 插入节点的父节点是黑节点
- 直接插入
- 插入节点的父节点是红节点
-
叔叔节点存在且为红节点
- 把父节点和叔叔节点设置为黑色
- 把祖父节点设置为红色
- 将祖父节点当作新插入的节点再次按规则变色
-
叔叔节点不存在或为黑色
- 父节点是祖父节点的左子节点
-
插入节点是父节点的左节点
1.将父节点设置为黑色 2.祖父节点设置为红色 3.将祖父节点右旋 -
插入节点是父节点的右节点
1.对父节点左旋 2.将父节点作为插入节点,得到上面的情形 3.再来一次右旋
-
- 父节点是祖父节点的右子节点
-
插入节点是父节点的右节点
1.将父节点设置为黑色 2.祖父节点设置为红色 3.将祖父节点左旋 -
插入节点是父节点的左节点
1.对父节点右旋 2.将父节点作为插入节点,得到上面的情形 3.再来一次左旋
-
- 父节点是祖父节点的左子节点