红黑树原理

2019-06-06  本文已影响0人  IT界刘德华

在理解红黑树之前,先看一些二叉查找树

二叉查找树特性

举个二叉树的例子:

可以看到如果要查询10的话,10>9

因此到他的右子树,右子树根节点为13,10<13

因此到其左子树,左子树根节点为11>10

到其左子树,为10,找到相应的节点

不过二叉查找树有一些问题,可能会出现不平横的情况,即如下图所示的情况

从这种情况可以看出,明显存在左子树和右子树深度相差过多,在使用平衡情况下的二叉查找树是时间复杂度为logn,而出现这种极端情况的话,想要查9的位置就需要每一次都遍历下一个右子树,很有可能时间复杂度变为n(与数组普通查询的时间复杂度相同)

\color{red}{基于上述情况,引入了平衡二叉树,红黑树即为平衡二叉树的一种}

红黑树

特性

正是由于这些原因使得红黑树是一个平衡二叉树

红黑树的例子

向红黑树中插入节点14(一般默认插入节点是红色的)

在原树上插入20

可以看到,插入以后树已经不是一个平衡的二叉树,而且并不满足红黑树的要求,因为20和21均为红色,这种情况下就需要对红黑树进行变色,21需要变为黑色,22就会变成红色,如果22变成红色,则需要17和25都变成黑色

而17变成黑色显然是不成立的,因为如果17变为黑色,那么13就会变为红色,不满足二叉树的规则,因此此处需要进行另一个操作---------左旋操作

对于上图由于右子树中17变为黑色以后需要把13变成红色,因此进行一次左旋,将17放在根节点,这样既可保证13为红色,左旋后结果

而后根据红黑树的要求进行颜色的修改

进行左旋后,发现从根节点17,到1左子树的叶子节点经过了两个黑节点,而到6的左叶子节点或者右叶子节点要经历3个黑节点,很显然也不满足红黑树,因此还需要进行下一步操作,需要进行右旋操作

由于是从13节点出现的不平衡,因此对13节点进行右旋,得到结果

而后再对其节点进行变色,得到结果

这便是红黑树的一个变换,它主要用途有很多,例如java中的TreeMap以及JDK1.8以后的HashMap在当个节点中链表长度大于8时都会用到

上一篇 下一篇

猜你喜欢

热点阅读