红黑树

参考文献

《数据结构与算法分析:C语言描述》
《算法导论》
https://www.cnblogs.com/skywang12345/p/3245399.html
https://www.jianshu.com/p/bbc060bd6b78
https://zhuanlan.zhihu.com/p/25358857
侵权,请联系本人删除。

红黑树特性

  1. 是一棵二叉搜索树
  2. 每个节点不是红色就是黑色
  3. 根(root)是黑色
  4. 红色的子节点一定是黑色
  5. 以任何一个节点为起点的路径上黑节点的数目一样

节点定义

// 红黑树的节点
typedef struct RBTreeNode{
    unsigned char color;        // 颜色(RED 或 BLACK)
    Type   key;                    // 关键字(键值)
    struct RBTreeNode *left;    // 左孩子
    struct RBTreeNode *right;    // 右孩子
    struct RBTreeNode *parent;    // 父结点
}Node, *RBTree;

基本操作

左旋

将右边的孩子提上来
在这里插入图片描述
在这里插入图片描述

右旋

将左边的孩子提上来
在1插入图片描述
在这里插入图片描述

插入

【第一步】
将红黑树当作一颗二叉查找树,将节点插入。
【第二步】
将插入的节点着色为"红色",因为这样不会违背其中一条准则"以任何一个节点为起点的路径上黑节点的数目一样"。
【第三步】
插入节点后,可能会违背“如果一个节点是红色的,则它的子节点必须是黑色的”。
通过一系列的旋转或着色等操作,使之重新成为一颗红黑树。

调整

因为发生冲突只会存在于两个邻接节点为红色时,冲突的场景被归纳为状态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)。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值