标签:不能 线性 旋转 额外 http 严格 nts 技术 集合框架
前言:本文解决的问题
红黑树(Black red Tree) 是一棵自平衡树,每个节点都遵循以下四条:
具体可以见下图
我们知道,一般在平衡二叉树(BST)作插入、删除、更新、查找的时间复杂度是O(log n),但是对于那种变形的BST(往一边偏的,变成线性的)时间复杂度就会变成O(n)。红黑树提供了为插入删除提供了最坏的时间保证2O(log n) ,因为它可以保持自平衡,总能把高度维持在 2log(n+1) (n为节点数目)。
相比AVL树而言,红黑树没有严格定义左右子树高度差值,并不严格意义的平衡。如果要涉及到很多插入、删除,用AVL的话会很多次旋转(rotation),此时红黑树是更好的选择。反之,查询多,更改少,即静态的话AVL是更好的选择。在查询效率上,由于AVL树严格平衡,AVL树会比红黑树略快,但时间复杂度是要给数量级上的。此外,相比较AVL树而言,红黑树需要额外的O(n)的空间来存储颜色。
在java集合框架中TreeSet和TreeMap是用红黑树实现的。
放方便后续说明,假设要插入的节点为Z,插入后Z的父节点为,Z.parent;Z父节点的兄弟为Z.uncle
Case 5 Z的父节点红色,叔叔节点是黑色的,Z与父节点、祖父节点在一条线上,即LL和RR的情况。(Z.uncle = black(line)->rotate.Z.grandparent &&recolor)
旋转Z的祖父节点,并重新着色,使满足红黑树特性。
下图中10是要加入的节点,初始树如下
把10加在末尾,涂红色
把Z.parent 变成黑色,Z.uncle变成黑色,为维持从上往下的路径中黑色节点数量不变,需要把Z.grandparent=red
把Z.parent旋转
结果如下
旋转Z的祖父节点,rotate the Z.grandparent,如图:
把旋转后的重新着色
红黑树的插入元素,总的来说分两部,先旋转,再着色。旋转把RL和LR型变成RR或者LL型,然后再旋转上一级元素;着色要满足红黑树的特性
https://en.wikipedia.org/wiki/Red%E2%80%93black_tree
5分钟学会红黑树插( insertint elements into a red black tree)
标签:不能 线性 旋转 额外 http 严格 nts 技术 集合框架
原文地址:https://www.cnblogs.com/java-learner/p/9571194.html