java-红黑树的插入

红黑树作为树的一种,也是满足于BST树的基本性质的。在此基础上,红黑又多了几条自己的特性:

1.每个节点都有颜色,不是黑色就是红色

2.根节点必须是黑色

3.所有叶子节点都是黑色,叶子节点是null节点,不存储实际数据

4.每个红色节点必须有俩个黑色的子节点,也就是说不能出现连续两个红色节点

5.从任一节点到其每个叶子节点的简单路径黑色节点的个数相同

红黑树并不追求“完全平衡”——它只要求部分地达到平衡要求,降低了对旋转的要求,从而提高了性能。

红黑树能够以O(log2 n) 的时间复杂度进行搜索、插入、删除操作。此外,由于它的设计,任何不平衡都会在三次旋转之内解决。当然,还有一些更好的,但实现起来更复杂的数据结构,能够做到一步旋转之内达到平衡,但红黑树能够给我们一个比较“便宜”的解决方案。红黑树的算法时间复杂度和AVL相同,但统计性能比AVL树更高。

红黑树的插入操作:

如果树为空,直接插入调整根节点指向与颜色就好了。

如果树不为空,分为三种情况:

1.待插入位置节点的叔叔节点是红色。

这种情况下直接把父节点和叔叔节点置为黑色,把祖先节点置为红色,然后指针指向祖先节点,向上回溯,检查有没有连续两个红色节点。

java-红黑树的插入_第1张图片

2.待插入节点的叔叔节点是黑色,而待插入节点与父节点和祖先节点在同一侧。

这种情况以祖先节点进行一次右旋操作,再调整好节点的颜色就行。

java-红黑树的插入_第2张图片

 

3.待插入节点的叔叔节点是黑色,但是待插入节点与父节点和祖先节点不再同一侧。

这种情况进行两次旋转操作

java-红黑树的插入_第3张图片

你可能感兴趣的:(java-红黑树的插入)