【我们尽量少说废话的讲完】C++红黑树原理
红黑树的出现
红黑树增删改查的时间复杂度都是O(logn)。
如果插入的数据随机,那么使用二叉搜索树即可保证树接近平衡。此时增删改查的效率都为O(logN)。
但如果插入的数据为有序的,此时二叉搜索树极其不平衡,退化为链表,时间复杂度降为O(N)。而红黑树就是为了应对这种极端情况。
红黑树的特点
红黑树的特点包括:
- 两个红节点不可相邻
- 根结点一定为黑色
- 左子树到根和右子树到根的黑色节点数量要相同
- 每次插入新节点默认为红色
即红黑树会根据以上的特点,当插入或删除节点导致不满足前三条条件时,红黑树会自行调整平衡。调整手段无外乎三种:变色、左旋和右旋。
红黑树插入删除节点可视化网站
可以从这个网站清晰的看到红黑树删除和插入时保持红黑树自身平衡的方法。
红黑树举例
红黑树插入举例
红黑树的插入和删除均是满足上面所说的前三条特征,其中删除比插入更为复杂。这里只对插入做举例说明。
有如下红黑树:
插入一个40:
两红相连 不合规
先右旋:
然后变色
再插入个30
变变色即可