红黑树小抄

这篇博客主要介绍了红黑树的性质和插入操作。在红黑树中,根节点是黑色,所有叶子结点是黑色的nil。插入时,先将新节点设为红色,然后依据BST的性质找到插入位置。当遇到不同情况,如父节点和叔叔节点颜色时,会进行相应的旋转和颜色调整。红黑树的插入、查找、删除的时间复杂度为O(logN)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

红黑树小抄

写在前面

算法分析课 期末考红黑树也是没谁了…

不过不幸中的万幸是应该只考插入,

我就在这打个小抄,大家就当考前热个身

红黑树的性质

  1. 是一颗BST(不会BST请自行查阅)
  2. 根节点是黑色,节点要么是红色要么是黑色
  3. 假设所有叶子结点是nil,则任意子树任意路径到达nil的黑色节点个数相同
  4. 所有叶子结点都是nil,并且是黑色
  5. 红节点不与红节点邻接,即如果某个节点是红色,其子节点一定是黑色(nil也是黑色)

红黑树的插入

前导知识
  • BST的旋转操作
  • BST的插入操作

待插入的节点一开始设为红色

我们根据BST的性质找到叶子结点的位置插入

叔叔节点:我们称当前节点的父节点兄弟节点叔叔节点

我们把指针指向待插入节点, 讨论待插入节点几种情况:

  1. 父节点是黑色,很幸运,直接插入。

  2. 当前没有节点,直接插入,并把节点染成黑色

  3. 父节点是红色

    1. 叔叔节点是红色

      • 把当前节点的 父节点叔叔节点染成黑色

      • 指针指向当前节点的祖父节点并将祖父节点染成红色

    2. 叔叔节点是黑色

      1. LL
        • 右旋当前指针节点
        • 交换指针节点右子节点的颜色
      2. LR
        • 左旋转化为LL
        • do LL
      3. RR
        • 左旋当前指针节点
        • 交换指针节点左子节点的颜色
      4. RL
        • 右旋转化为RR
        • do RR

复杂度

这里打个小抄,不做证明

插入、查找、删除的时间复杂度只与红黑树的高度有关

h e i g h t = 2 l o g ( N + 1 ) → O ( l o g N ) height = 2log(N+1) \rightarrow O(logN) height=2log(N+1)O(logN)

证明的思路大概就是:

  • 首先忽略黑节点,计算只有红节点的树的高度
  • 忽略红节点,计算只有黑节点的树的高度
  • 将高度相加即为红黑树的高度
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值