红黑树

1.为什么要用红黑树

  了解红黑树之前先要知道二叉查找树(BST)
简单来说,二叉查找树有如下特点:

  1. 左子树上的点小于根节点的值
  2. 右子树上的点大于根节点的值
  3. 左右子树必定分别为二叉排序树
    我们理想的构建二叉排序树的结果是让他尽可能“扁平”。最理想的是让其变成平衡二叉树。这样查询效率为O(logN),其中N为树的高度。但是有时候往往会出现如下情况:根节点过大或过小,导致子节点集中分布在左子树或者右子树。这种情况的极端表现是从根节点开始,树变成了一根“斜线段”。此时查找效率大大降低(等同于Brute Force-----O(N))。所以在这种情况下,黑树就诞生了!
2.红黑树概念

  红黑树是一中平衡的二叉查找树,它不会出现“斜线段”的情况。除了拥有BST的特性外,还具备如下性质:

1. 节点是红色或者黑色(名字由来)
2. 根节点是黑色
3. 每个叶子节点都是黑节点(NULL)
4. 每个红色节点的儿子都是黑色节点
5. 从任意节点到每个叶子节点的路径都会包含数量相同的黑色节点

单纯从概念上来看,这完全就是变了颜色的平衡二叉树(AVL)啊。其实他们之前是不一样的,红黑树没有AVL要求那么严格(不需要左子树与右子树高度差小于等于1),所以红黑树可以稍微“长”那么一点。有的地方称之为“自平衡的二叉查找树”

3.红黑树之自平衡

以下转自https://www.jianshu.com/p/e136ec79235c


当在10亿数据中只需要进行10几次比较就能查找到目标时,不禁感叹编程之魅力!人类之伟大呀! —— 学红黑树有感
拿出刚才的性质5:
  任意一结点到每个叶子结点的路径都包含数量相同的黑结点
从性质5又可以推出:

  • 性质5.1:如果一个结点存在黑子结点,那么该结点肯定有两个子结点

下图就是一颗简单的红黑树。其中Nil为叶子结点,并且它是黑色的。
在这里插入图片描述
   红黑树并不是一个完美平衡二叉查找树,从图可以看到,根结点P的左子树显然比右子树高(且差值为2),但左子树和右子树的黑结点的层数是相等的,也即任意一个结点到到每个叶子结点的路径都包含数量相同的黑结点(性质5)。所以我们叫红黑树这种平衡为黑色完美平衡。
PS:这里需要注意,虽然红色的儿子一定是黑色,但是黑色的儿子不一定是红色!也就是说黑色节点完全可以存在黑色子节点

1. 红黑树能自平衡,它靠的是什么?三种操作:左旋、右旋和变色。
  • 左旋:以某个结点作为支点(旋转结点),其右子结点变为旋转结点的父结点,右子结点的左子结点变为旋转结点的右子结点,左子结点保持不变。
    左旋
  • 右旋:以某个结点作为支点(旋转结点),其左子结点变为旋转结点的父结点,左子结点的右子结点变为旋转结点的左子结点,右子结点保持不变。
    右旋
  • 变色:结点的颜色由红变黑或由黑变红。

我们先忽略颜色,可以看到旋转操作不会影响旋转结点的父结点,父结点以上的结构还是保持不变的。
左旋只影响旋转结点和其右子树的结构,把右子树的结点往左子树挪了。
右旋只影响旋转结点和其左子树的结构,把左子树的结点往右子树挪了

  所以旋转操作是局部的。另外可以看出旋转能保持红黑树平衡的一些端详了:当一边子树的结点少了,那么向另外一边子树“借”一些结点;当一边子树的结点多了,那么向另外一边子树“租”一些结点。
但要保持红黑树的性质,结点不能乱挪,还得靠变色了。怎么变?具体情景有不同变法,后面会具体讲到,现在只需要记住红黑树总是通过旋转和变色达到自平衡

2. 红黑树查找

因为红黑树是一颗二叉平衡树(不严格意义上的,因为不需要满足平衡条件),并且查找不会破坏树的平衡,所以查找跟二叉平衡树的查找无异。

  由于红黑树总保持黑色完美平衡,所以它的查找最坏时间复杂度为O(2lgN)----(因为一个有n个节点的红黑树,其高度最高为2log(n+1)的),也即整颗树刚好红黑相隔的时候。能有这么好的查找效率得益于红黑树自平衡的特性,而这背后的付出,红黑树的插入操作功不可没。
在这里插入图片描述

3. 红黑树插入
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值