一:什么是红黑树
红黑树其实是一个平衡性被弱化的二叉搜索树,我们带着问题来看文章。
1、什么是平衡树什么又是二叉搜索树呢?
2、为什么红黑树的平衡性要被弱化?
3、为什么Java中HashMap,TreeMap底层结构要使用红黑树呢?
平衡树的概念:任意节点其左子树和右子树的高度差不能大于1(不了解树的概念的同学可以看上篇文章)
二叉搜索树概念:任意节点其左子树中所有的节点小于该节点,其右子树中所有的节点大于该节点。
为什么需要平衡和搜索树两个概念看下文。
例如上图,就是一颗二叉搜索树,当我们要在二叉搜索树中查找值为1的节点,首先从根节点查找,根节点的值为6,1<6所以直接过滤掉根节点的右子树所有的值,从根节点的左节点4查找,此时1<4,依然过滤掉节点为4的所有的右子树,每次按照上面的步骤查找,会发现一颗平衡度较高的二叉搜索树每次查找都可以过滤掉一半的数据,查找的效率相当于二分查找,时间复杂度为O(logn)。
如果出现极端的情况,二叉搜索树可能会退化成链表,所有的值都会在某个节点的左子树下或者右子树下,此时就相当于要遍历树中的每个节点才能查找该值,搜索的时间复杂度退化为O(n),所以要想组织一个便于搜索的数据结构,平衡和搜索两个概念都要顾及,而红黑树就是一个平衡性被弱化的二叉搜索树。
黑红树的平衡性为什么要被弱化?在数据结构中AVL树,就是一个高度平衡的搜索二叉树,然而为了维护它的平衡性,在树中进行插入和删除时,每次需要进行左旋和右旋操作维护它的平衡性,是一个非常耗时的操作,所以为了考虑效率遍创造出了红黑树来弱化平衡性带来的耗时操作。
在HashMap,TreeMap中底层为什么要使用到红黑树?在数据结构中,用的比较多的是数组,链表,散列表,树。
在Java的ArrayList,LinkedList中:底层分别使用的是数组和链表,在这两种结构中要想查找一个值,需要遍历整个结构,其时间复杂度是O(n),作为JDK的类库当数据量大且需要追求性能时肯定不会使用。
散列表:主要依靠散列函数来快速定位到数组中的某个位置,如若不存在散列冲突其时间复杂度是O(1),但是在业务中数据是动态添加的,会存在扩容情况,当频繁出现扩容,会导致该数据结构性能不稳定。
红黑树:是一个平衡性被弱化的二叉搜索树,因为性能稳定,插入,查找,删除的时间复杂度是O(logn),且二叉搜索树的中序遍历是有序的,在某些范围查找的业务中性能非常高。
二:红黑树的定义
红黑树其实就是将一颗二叉搜索树按一定的规律进行染色,只要遵循染色的规律,就可以保证其平衡性。
1、所有的根节点必须为黑色
2、所有的叶子节点数据为null,且必须为黑色。
3、任意节点到可达的叶子节点,其经过的黑色节点数量一致。
4、红色节点一定不能相邻。
在手写红黑树代码时,只要按照以上的定义对节点进行染色,就能保证二叉搜树的弱平衡性。