前言
红黑树是一个查找效率和构建效率都比较优秀的一种数据结构。
比如java8中的hashmap在扩容的时候,如果table长度达到64,并且链表长度达到8就会对其进行转红黑树的操作。
每次插入新的数据的时候,会变色和旋转,来让高度保持在log2(N)这个合理高度内
概念
首先要知道,红黑树是一种特殊的二叉树!
形状和AVL树很像,但是AVL树是有平衡因子进行强制平衡,而红黑树是由自己的一些特点包括变色和左旋右旋来实现平衡。
规则
(1)每个节点或者是黑色,或者是红色。并且每次新插入的节点都是红色。
(2)根节点是黑色。
(3)每个叶子节点(NUIL)是黑色。 [注意:这里叶子节点,是指为空的叶子节点!]
(4)如果一个节点是红色的,则它的子节点必须是黑色的,也就是说不可能出现两个连续的红色节点,不过两个连续的黑色节点是可能出现的
(5)从任意一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。
查询
红黑树的查询和普通的二叉搜索树查询是一样的,当我想查某个数的时候,只需要把这个数从根节点比较,如果比根节点大,那就继续比较根节点的右节点,否则就是根节点的左节点,以此类推。
插入
学习怎么构建红黑树之前,我们必须掌握几个基本的知识!
1、红黑树在插入数据的时候,会先遍历数据应该插入到哪个位置,插入的位置肯定在底部,不可能在中间突然插入一个值。
2、插入的数据一定是红色的(因为要遵守红黑树的第五条规则,如果有一条分支增加了一个黑色节点,就会打破该规则)
3、插入之后,为了满足规则4,就需要用到换色与左旋、右旋的操作了</