参考链接:
https://www.cnblogs.com/hilow/p/3949188.html
https://www.cnblogs.com/CarpenterLee/p/5503882.html
红黑树调整模拟:
https://www.cs.usfca.edu/~galles/visualization/RedBlack.html
时间复杂度:
查询,插入,删除的时间复杂度都是O(log n)
红黑树特点:
- 节点必须是红色或者黑色。
- 根节点必须是黑色。
- 叶节点(NIL)是黑色的。(NIL节点无数据,是空节点)
- 红色节点必须有两个黑色儿子节点。
- 从任一节点出发到其每个叶子节点的路径,黑色节点的数量是相等的。
图示:
左旋或者右旋操作:
插入结点:
1、红色结点不影响深度,插入先默认红色
插入当前结点为N,父节点P,父节点的兄弟结点为U
平衡情况说明及调整方案
①根结点,直接设置黑色
②P黑,则直接插入红
③P红,U红,则P和U变黑,并他们的父结点变红, 爷爷结点是红,则需要以红色递归
④P红,U黑,若N和U同是右节点,则交换N和P(相当于一次旋转),然后转⑤
⑤ P红,U黑,若N和U一个是左结点,一个是又结点,则交换P和U 的颜色,然后旋转
删除结点:
1、删除结点并保留其二叉树排序的性质,找到其前驱或者后继结点,即排序值在删除结点前一个或者后一个的结点,代替删除的结点。
这样就转化为,删除一个结点,此结点最多只有一个非NIL子结点。
2、情况假设和处理办法,假设处理结点为左结点,右结点同理
假设代替结点为M,代替结点的子节点为C,M结点的父节点为P, M结点的兄弟结点为S
删除代替结点后可能出现情况:
-- M为红类
① 若M为红,则C直接代替M,深度不变。
说明:M的下级结点不可能为2个黑,因为M最多只有一个子结点,2个黑会不平衡。
-- M为黑类
② 若M为黑,并且仅有的C为红,则C直接代替M,并变C为黑。
③ 若M为黑,仅有的C为黑,不会有这种情况
④ 若M为黑,且无子结点
IV、若M为根结点,则直接删除
I、若S为红,则P必为黑,则交换S和P的颜色,并左旋,深度不变,N的父结点P变为红色,并且以S点来看不平衡,然后转⑤转⑥达到平衡
II、若S为黑,且P黑,则S->红色,深度-1,并在黑色结点进行递归
III、若S黑,且P红,则S和P交换颜色,深度不变
-- 经过第一次变化后,两边深度差一之后,
⑤ 若P任意颜色,S黑色,SL红,SR黑,则S右旋并转到⑥
⑥ 若P任意颜色,S黑色,SL黑,SR红,则左旋,并交换P和S颜色,并SR转成黑色,深度不变。
其他,若S红,则同④-I,
3、最多旋转次数: 3次
由④-I转⑤转⑥
代码解析:
插入操作:
删除操作: