浅析红黑树底层原理及实现

红黑树是一种近似平衡的二叉搜索树,查找效率为O(nlogN),相较于AVL树,其构建成本更低。红黑树的性质包括节点颜色为红或黑,根节点为黑色,不能有连续的红节点,每个节点到其所有后代叶节点的路径包含相同数量的黑色节点。插入节点时,默认插入红色节点,根据节点父亲和叔叔的颜色进行不同情况的调整,确保树的平衡。
摘要由CSDN通过智能技术生成

我们在上一篇博客认识到了平衡二叉树(AVLTree),了解到平衡二叉树的性质,其实平衡二叉树最大的作用就是查找,AVL树的查找、插入和删除在平均和最坏情况下都是O(logn)。AVL树的效率就是高在这个地方。如果在AVL树中插入或删除节点后,使得高度之差大于1。此时,AVL树的平衡状态就被破坏,它就不再是一棵二叉树;为了让它重新维持在一个平衡状态,就需要对其进行旋转处理, 现在呢,我们来思考一下虽然AVL树的查找效率高,但是呢构建一颗AVL树的成本是多少?? 因为当它的高度差大于1的时候,就要触发旋转算法来调节平衡二叉树,所以当你数据足够大的时候,那么你创建一颗平衡二叉树的成本其实不小. 这个时候就有人开始思考,并且提出了红黑树的理论,那么红黑树到底比AVL树好在哪里?首先我们应该知道由于AVL树的性质,当它的任意两个分支之间的高度差大于一的时候就会触发旋转算法,所以构建一棵树得触发很多次旋转算法,这里的AVL树的查找时间复杂度为O(logN),但是红黑树它的性质让它的查找的时间复杂度为O(nlogN).可以看出AVL树时间复杂度优于红黑树,BUT!! 在计算机中它的计算速度惊人每秒的运算量都是亿级的,所以nlogN和logN在计算机面前没有什么区别,红黑树触发旋转算法的概率要远远小于AVL树,这时构建一个红黑树的成本也就远远小于AVL树,所以生活中经常使用的都是红黑树.(AVL树只是红黑树的一个前身,红黑树就是AVL树的加强版)首先我们来认识红黑树的性质,红黑树是一颗二叉搜索树,它在每个节点上增加了一个存储为来表示节点的颜色,可以RED或BLACK,通过对任何一条从根到叶子简单路径上的颜色约束,红黑树保证最长路径不超过最短路径的两倍,因而近似平衡.。

红黑树的具体性质

1.每个节点的颜色不是红色就是黑色.

2.红黑树的根节点必须是黑色的.

3.不能出现连续的红节点

4.对每一个节点,从该节点到齐所有后代节点的简单路径上,均包含相同数目的黑色节点.

其实当我们的上面这些条件满足后,这棵树就是已经是一个最长路径不超过最短路径的两倍了. 具体为什么??

 

很明显,只要满足上面几条性质,最长路径一定超过最短路径的两倍。

红黑树的插入

首先红黑树的插入其实不是那么容易实现的,以前搜索树的插入我们很容易理解现在我们首先思考一个问题,你插入节点的默认颜色是RED或BLACK? 这里我们需要根据性质来思考,首先如果插入黑节点,这个可以直接插入无论它的父亲是什么颜色,但是红黑树的性质是每条路径的黑色节点数目相同这个时候你再想想那其他路径的黑色节点数目一定比你现在少一个节点,所以调整起来是非常繁琐的. 插入红节点不需要调整其他路径,如果它的父亲为黑,那么直接插入,如果他的父亲为红那么在该路径上面开始分情况调整. 所以插入节点默认颜色一定要为红.如果为黑调节成本太大了.接下来开始插入节点如果插入节点的父亲为黑那么直接插入后返回不需要做任何调整. 但是如果插入节点的父亲为红,那么就需要调整了.具体的调整过程可以分为三个情况:

1. 新插入节点cur的父亲为红,并且祖父节点(gf)为黑,叔叔节点(uncle)存在且为红

这种情况是最简单的情况,出现了两个连续的红节点需要调整,我们只需要将parent和uncle变为黑

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值