红黑树介绍与应用
红黑树是特殊的二叉查找树,意味着它满足二叉查找树的特征:任意一个节点所包含的键值,大于等于左孩子的键值,小于等于右孩子的键值。
通过红黑树查找和插入的复杂对都为O(log n)。
红黑树的性质:
1.每个节点是红的或者黑的;
2.根节点是黑的;
3.每个叶子节点是黑的;
4.如果一个节点是红的,则它的两个儿子的黑的;
5.对每个节点,从该节点到其子孙节点的所有路径上的包含相同数目的黑节点。
红黑树的功能有两个:1.通过key,value查找。2.利用红黑树的中序遍历是顺序的。
红黑树可以应用在
1.map
2.nginx
3.定时器
4.进程调度cfs
5.内存管理:开辟一块内存,指针指向这块内存的开始位置,并记录长度,作为红黑树的一个节点。
树的旋转:
红黑树的实现:
每个红黑树的节点包括6个属性:关键字 key,value,right,left,parent,color
增加节点:
红黑树增加节点需要调整的有三种情况:
需要调整的前提条件:插入节点的父节点是红色的
1. 叔父节点是红色的
2. 叔父节点是黑色的或者没有叔父节点,当前节点是父节点的左子树(若 叔父节点不为红色,则肯定叔父节点肯定为叶子节点)
3. 叔父节点是黑色的或者没有叔父节点,当前节点是父节点的右子树
违背规则 | 具体情况(当前节点的父节点是红色,且父节点是祖父节点的左子树) | 处理策略 |
情况一 | 叔父节点是红色的 |
(1)把当前节点的父节点和叔父节点改为黑色 (2)将祖父节点改为红色 (3)将祖父节点作为当前节点 (4)依次往上迭代,修改违背规则的情况,直到没有违背 |
情况二 | 叔父节点是黑色的或者没有叔父节点,当前节点是父节点的右子树 |
(1)以当前节点的父节点为基准,进行左旋 (2)将父节点改为黑色,祖父节点改为红色 (3)以当前节点的祖父节点进行右旋 |
情况二 | 叔父节点是黑色的或者没有叔父节点,当前节点是父节点的左子树 |
(1)将父节点改为黑色,祖父节点改为红色 (2)以当前节点的祖父节点进行右旋 |