红黑树

2018-11-22  本文已影响0人  目睹了整个事件的索先生

https://mp.weixin.qq.com/s/ZUAbDZkVaCG1-Va_kGF6DA

二叉搜索树

二叉搜索树是个很好的数据结构,可以快速地找到一个给定关键字的数据项,并且可以快速地插入和删除数据项。但是二叉搜索树有个很麻烦的问题,如果树中插入的是随机数据,则执行效果很好,但如果插入的是有序或者逆序的数据,那么二叉搜索树的执行速度就变得很慢。因为当插入数值有序时,二叉树就是非平衡的了,排在一条线上,其实就变成了一个链表……它的快速查找、插入和删除指定数据项的能力就丧失了

为了能以较快的时间 O(logN) 来搜索一棵树,需要保证树总是平衡的(或者至少大部分是平衡的),这就是说对树中的每个节点在它左边的后代数目和在它右边的后代数目应该大致相等。红-黑树的就是这样的一棵平衡树,对一个要插入的数据项,插入例程要检查会不会破坏树的特征,如果破坏了,程序就会进行纠正,根据需要改变树的结构,从而保持树的平衡。

红黑树特征

  1. 每个节点不是黑色就是红色
  2. 根节点总是黑色的
  3. 如果节点是红色的,那么它的子节点必须是黑色的(反之不一定)
  4. 从根节点到叶节点或者空子节点的每条路径,必须包含相同数目的黑色节点(相同的黑色高度)
    在红黑树中插入的节点都是红色的,这不是偶然的,因为插入一个红色节点比插入一个黑色节点违背红-黑规则的可能性更小。原因是:插入黑色节点总会改变黑色高度(违背规则4),但是插入红色节点只有一半的机会会违背规则3。另外违背规则3比违背规则4要更容易修正。当插入一个新的节点时,可能会破坏这种平衡性,那么红-黑树是如何修正的呢?

红黑树的修正

主要由三种方式对平衡进行修正,改变节点颜色、左旋和右旋。

1. 变色

2. 左旋

3. 右旋

上一篇 下一篇

猜你喜欢

热点阅读