定义
一种含有红黑节点并能自平衡的二叉查找树(BST)
性质
- 1.每个节点有红/黑标记位
- 2.根节点是黑色(硬性规定)
- 3.每个叶子节点(NIL)都是黑色的虚节点(由此引出性质5)
叶子节点 color = black,value = None - 4.每个红色节点的两个字节点一定是黑色的
红色节点一定有父节点,并且父节点一定是黑色 - 5.任意一系欸但到每个叶子节点的路径都包含数量相同的黑色节点(黑色完美平衡)
由性质1可定义红黑树节点
class RedBlackNode():
def __init__(self,val,color='Red'):
self.color = color
self.left = None
self.right = None
self.parent = None
self.value = value
平衡性
RBT不是AVL,红色非平衡,黑色平衡
新增节点只需考虑当前节点的三代(祖父母G 父母P 叔叔U 兄弟B 当前节点C),其他节点无需考虑
自平衡的原子操作
自平衡包括:变色,旋转(同AVL树,基于最短路径来确定旋转方向)
查找操作
红黑树的查找操作和二叉查找树相同,时间复杂度O(logn)
新增操作
分以下几种情况
- 1.C = root
即没有父节点,新增C=red,修改C=black
- 2.C.parent = black
新增C = red
- 3.C.parent = red && C.uncle = red
(此操作没有旋转,只有变色)
新增C=red
变色GPU,P=black,U=black,G=red
若G变红导致不满足性质,将G作为新增节点递归处理
- 4.C.parent = red && (C.uncle = black || C.uncle == None)
若 CPG在三点一线
以P为圆心,旋转G节点
变色P,G节点
若CBG为三角关系
以C为原因旋转P,后以P为圆心,旋转G节点
变色P,G节点
常见面试题
Java的HashMap的数据结构是什么?
内部使用一个桶数组来存储,当桶里面原色达到一定数量时候,会自行进行扩容到原来的1.5倍。当哈希碰撞激烈,在桶的某个位置上聚集的元素增多,会自动生成一个单链表,采用尾插法,当链表长度多于8,会自动进化成红黑树,为什么这样呢?由于单链表的查找时间复杂度为O(n),如果单链表长度过长会导致查找变慢,红黑树的特点是稳定,无论查找、插入、删除时间复杂度都是O(logn),虽然复杂但保证了效率。