红黑树学习笔记

红黑树学习笔记

红黑树的两种使用场景

  1. 通过key查找value
  2. 中序遍历是顺序的

使用实例

  1. std::map
  2. nginx
  3. 定时器
  4. 进程调度cfs——用红黑树存储n个进程,公平调度——使用中序遍历
  5. 内存管理——从一大块内存中,每次申请一小块,每个小块可以用红黑树存起来——起始位置做key,每分配一小块,往红黑树上加一个节点。

红黑树性质

  1. 每个结点是红色或黑色
  2. 根结点是黑色
  3. 每个叶子节点是黑色
  4. 如果一个结点是红的,则它的两个儿子都是黑的
  5. 对每个结点,从该结点到其子孙结点的所有路径上包含相同数目的黑色结点——决定了红黑树的平衡——平衡了黑色的高度

红黑树的旋转

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zs1WxhiP-1680682083893)(image/rbtree_node/1680661761051.png)]

旋转与红黑没关系,就当作二叉树的旋转。

操作步骤(一共涉及6个指针):

  1. x的右子树指向y的左子树;
  2. y的parent指向x的parent;
  3. parent原来指向x的指针指向y

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pWGmR6SS-1680682084741)(null)]

调整函数的三种情况:

  1. 默认条件:当前结点是红色、父结点是红色(暗含:祖父结点是黑色,叔父结点是黑色或红色):
  2. 叔父结点是红色
  3. 叔父结点是黑色,当前结点是父结点的 左子树;
  4. 叔父结点是黑色,当前结点是父结点的右子树;

几个思考:

  1. 要不要牵扯到祖父结点的颜色?——不需要——一定是黑色的(父结点是红的)
  2. 知道叔父结点的颜色是为了方便旋转;
  3. 区分红黑两色的意义:保证了黑高相等,也就保证了数的平衡
  4. 红黑树是由2-3-4数变种来的;
  5. 平衡二叉树的每个结点都记录 了高度:左右子树的高度相差超过1时进行调整;
  6. 红黑树的左右两个子树结点数的差别最大是2n-1;

删除结点

移除结点和删除结点不同,未完待续…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值