参考文献
《数据结构与算法分析:C语言描述》
《算法导论》
https://www.cnblogs.com/skywang12345/p/3245399.html
https://www.jianshu.com/p/bbc060bd6b78
https://zhuanlan.zhihu.com/p/25358857
侵权,请联系本人删除。
红黑树特性
- 是一棵二叉搜索树
- 每个节点不是红色就是黑色
- 根(root)是黑色
- 红色的子节点一定是黑色
- 以任何一个节点为起点的路径上黑节点的数目一样
节点定义
// 红黑树的节点
typedef struct RBTreeNode{
unsigned char color; // 颜色(RED 或 BLACK)
Type key; // 关键字(键值)
struct RBTreeNode *left; // 左孩子
struct RBTreeNode *right; // 右孩子
struct RBTreeNode *parent; // 父结点
}Node, *RBTree;
基本操作
左旋
将右边的孩子提上来
右旋
将左边的孩子提上来
插入
【第一步】
将红黑树当作一颗二叉查找树,将节点插入。
【第二步】
将插入的节点着色为"红色",因为这样不会违背其中一条准则"以任何一个节点为起点的路径上黑节点的数目一样"。
【第三步】
插入节点后,可能会违背“如果一个节点是红色的,则它的子节点必须是黑色的”。
通过一系列的旋转或着色等操作,使之重新成为一颗红黑树。
调整
因为发生冲突只会存在于两个邻接节点为红色时,冲突的场景被归纳为状态2与状态3,状态而可以通过旋转将红色节点上级,并完成下游节点的冲突处理,而状态三则可以通过旋转+染色变成状态2,从而根据状态2的调整策略完成红色节点的上移。
【case①:父亲节点是黑色】
【case②:叔叔节点是红色】
调整如下图所示,接着递归(从节点G开始)。
【case③:叔叔是黑色,父亲节点是左孩子】
【3.1:插入结点是其父结点的左子结点】
左左
【3.2:插入结点是其父结点的右子结点】
左右
【case④:叔叔是黑色,父亲节点是右孩子】
【4.1:插入结点是其父结点的右子结点】
右右
【4.2:插入结点是其父结点的左子结点】
右左
案列
依次插入(1,2,3,4,5,6,7,8,9,10)。