红黑树学习笔记
红黑树的两种使用场景
- 通过key查找value
- 中序遍历是顺序的
使用实例
- std::map
- nginx
- 定时器
- 进程调度cfs——用红黑树存储n个进程,公平调度——使用中序遍历
- 内存管理——从一大块内存中,每次申请一小块,每个小块可以用红黑树存起来——起始位置做key,每分配一小块,往红黑树上加一个节点。
红黑树性质
- 每个结点是红色或黑色
- 根结点是黑色
- 每个叶子节点是黑色
- 如果一个结点是红的,则它的两个儿子都是黑的
- 对每个结点,从该结点到其子孙结点的所有路径上包含相同数目的黑色结点——决定了红黑树的平衡——平衡了黑色的高度
红黑树的旋转
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zs1WxhiP-1680682083893)(image/rbtree_node/1680661761051.png)]
旋转与红黑没关系,就当作二叉树的旋转。
操作步骤(一共涉及6个指针):
- x的右子树指向y的左子树;
- y的parent指向x的parent;
- parent原来指向x的指针指向y
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pWGmR6SS-1680682084741)(null)]
调整函数的三种情况:
- 默认条件:当前结点是红色、父结点是红色(暗含:祖父结点是黑色,叔父结点是黑色或红色):
- 叔父结点是红色
- 叔父结点是黑色,当前结点是父结点的 左子树;
- 叔父结点是黑色,当前结点是父结点的右子树;
几个思考:
- 要不要牵扯到祖父结点的颜色?——不需要——一定是黑色的(父结点是红的)
- 知道叔父结点的颜色是为了方便旋转;
- 区分红黑两色的意义:保证了黑高相等,也就保证了数的平衡;
- 红黑树是由2-3-4数变种来的;
- 平衡二叉树的每个结点都记录 了高度:左右子树的高度相差超过1时进行调整;
- 红黑树的左右两个子树结点数的差别最大是2n-1;
删除结点
移除结点和删除结点不同,未完待续…