红黑树

在认识红黑树之前,先来理解下二叉查找树(BST)。

二叉查找树特征:
1, 左子树上所有的节点的值均小于或等于他的根节点的值
2, 右子数上所有的节点的值均大于或等于他的根节点的值
3, 左右子树也一定分别为二叉排序树

下面为标准的二叉排序树
在这里插入图片描述
那问题来了,为什么一定要这种结构呢?换句话说这样的结构有什么好处呢?我们就来查找下值为10的节点。它怎么一步步的找到这个节点的?步骤是怎样的?
在这里插入图片描述
这不是二分查找的思想吗?确实,查找所需的最大次数等同于二叉查找树的高度。当然在插入节点的时候,也是这种思想,一层一层的找到合适的位置插入。但是二叉查找树有个比较大的缺陷,而且这个缺陷会影响到他的性能。我们先来看下有一种情况的插入操作:

如果初始的二叉查找树只有三个节点,如下图:
在这里插入图片描述
依次插入5个节点:7、6、5、4看下图插入之后的图:

在这里插入图片描述
左边变成了一条线性表,而不是树了,也就是说查找的性能大打折扣,几乎就是线性查找了。

那有没有好的办法解决这个问题呢?解决这种多次插入新节点而导致的不平衡?

红黑树

红黑树就是一种平衡的二叉查找树,说他平衡的意思是他不会变成“瘸子”,左腿特别长或者右腿特别长。除了符合二叉查找树的特性之外,还具体下列的特性:

  1. 节点是红色或者黑色
  2. 根节点是黑色
  3. 每个叶子的节点都是黑色的空节点(NULL)
  4. 每个红色节点的两个子节点都是黑色的。
  5. 从任意节点到其每个叶子的所有路径都包含相同的黑色节点。

“叶结点” 或"NULL结点",它不包含数据而只充当树在此结束的指示

下面为标准的红黑树,建议大家对照下面的图理解上边写的红黑树的性质
在这里插入图片描述

当插入和删除节点,就会对平衡造成破坏,这时候需要对树进行调整,从而重新达到平衡。那什么情况下会破坏红黑树的规则呢?

例如上面标准的红黑树,插入值为12的节点

在这里插入图片描述
插入之后发现仍然满足红黑树的要求!

但是如果插入值为21的节点呢?

如下图所示:
在这里插入图片描述
由于父节点22是红色节点,因此这种情况打破了红黑树的规则4,必须作出调整。那么究竟该怎么调整呢?主要方法包括变色旋转(左,右)两种方式。

变色

为了符合红黑树的规则,会把节点红变黑或者黑变红。下图展示的是红黑树的部分,需要注意节点25并非根节点。因为21和22链接出现红色,不符合规则4,所以把22红变黑:
在这里插入图片描述
但这样还是不符合规则5,所以需要把25黑变红,看下图:
在这里插入图片描述
因为25和27又是两个连续的红色节点(规则4),所以需要将27红变黑。
在这里插入图片描述
看一下经过变色后树的全貌
在这里插入图片描述
由于17和25是连续的两个红色节点,那么把节点17变黑色的就打破了规则4了,而且根据规则2,也不可能把13变成红色。变色已经无法解决问题了,所以只能进行旋转了。

左旋转思想示意图如下
在这里插入图片描述

看下面的左旋转静态示意图
在这里插入图片描述
按照左旋转,对上边已经变色完成之后图进行左旋转。
在这里插入图片描述
在这里插入图片描述
规则二:根节点必须是黑色,所以需要变色,结果如下图:
在这里插入图片描述
规则五:从任意节点到其每个叶子的所有路径都包含相同的黑色节点。
上图17-13-8-1-6-N经过了4个黑色节点而其他都为3个
这个时候就需要右旋转了

左旋转思想示意图如下
在这里插入图片描述
看下面的右旋转静态示意图
在这里插入图片描述
接下来,对上边经过左旋转之后的图进行右旋转。
在这里插入图片描述
在这里插入图片描述
最后一个步骤 变色!
在这里插入图片描述
那么,这么复杂的算法,有哪些应用呢?

  1. 在java中Tree Map就是用的红黑树,也就是平常使用的键值对
  2. 在函数中实现关联数组也是用的红黑树
  3. 在实施计算中也有用到红黑树
  4. 在图像处理中的计算几何也会用到红黑树

高度
如果一颗含有n个内部节点的红黑树.它的最大高度是多少?

2lg(n+1)

其中lg是以2为底的对数

引理https://blog.csdn.net/huangyimo/article/details/81611151

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值