二叉树:
左子树小于根节点,右子树大于根节点。
缺点:当最高子树和最低子树高度相差太多时,查询的时间复杂度太高,变成了O(n)。
AVL树:
平衡二叉树,满足最高子树和最低子树之差不能超过1
在元素插入时,会进行自旋,以满足上面的性质。
缺点:频繁的自旋影响性能,适合插入少,查询为主的场景。
左旋:
右旋:
红黑树
最高子树和最低子树高度之差小于2倍即可,如最低子树高度是4,最高子树高度最多是8。
损失了部分查询的性能,来提升插入的性能。
增加了变色特性,来满足插入和查询性能之间的平衡。
性质:
- 根节点是黑色(根节点是没有父节点的节点)
- 不能有连在一起的红色节点
- 红色节点的两个子节点都是黑色
- 叶子节点(没有左右子树的节点)都是黑色
变换:
- 变色
- 左旋
- 右旋
变换规则:
-
所有插入的节点都是红色
-
变色:
若当前节点的父节点、叔叔节点都是红色:
把父、叔叔节点都变成黑色。
把爷爷节点变成红色。 -
左旋:
若父节点是红色,叔叔节点是黑色,且当前节点是右子树时,左旋!
(父节点是上面左旋示意图的E,当前节点是S) -
右旋:
若父节点是红色,叔叔节点是黑色,且当前节点是左子树,右旋!
注意:右旋要以爷爷节点来旋转,爷爷节点是上面右旋示意图的S,父亲节点是E
旋转完成后,把父节点变成黑色。
把爷爷节点变成红色。
视频参考:https://www.bilibili.com/video/av70652717?p=4