2-3 树/红黑树(red-black tree)
2-3 tree
**2-3树节点**:
1. null节点,null节点到根节点的距离都是相同的,所以2-3数是平衡树
2. 2叉节点,有两个分树,节点中有一个元素,左树元素更小,右树元素节点更大
3. 3叉节点,有三个子树,节点中有两个元素,左树元素更小,右树元素更大,中间树介于两个父元素之间。
 
插入操作如下图所示

红黑树
红黑树可以理解为实现了2-3树的BST(binary search tree),它是一个自平衡树,保证在最坏的情况下的操作也是O(lg(n))
特性:
- 每个节点有一个颜色属性(红或黑)
- 根节点是黑色的
- 所有的null节点都是黑色的,从任何null节点到根节点所经过的黑色节点数目相同
查找操作与BST是相同的
插入规则如下:
- 按BST的插入方法在null节点上建立新节点,新节点的颜色为红色
- 如果有右子节点为红色,则左旋,右子节点变为父节点
- 如果左子节点与左孙节点都为红色,则进行右旋,左字节的变为父节点
- 如果两个节点的颜色都为红色,则翻转反色
操作流程如下图所示:
- 图左为插入节点c,先标记为红,因为a、c都为红节点,故颜色反转
- 中间插入节点a,由于插入后a、b节点都为红色,按第3条规则需要进行右旋操作,b变成了新的父节点
- 图右插入节点b,由于b在a的右边,故先进行左旋,然后又发现a、b同为红色,再进行右旋
左旋:
左图为左旋前,右图为左旋后,代码如下所示:
private Node rotateRight(Node h){
assert isRed(h.right);
Node x = h.right; // 复制h的 右子树 为节点x
h.right = x.left; // 将x的左子树移动到h的右节点上(替代)
x.left = h; // 将修改后的h节点作为x的左节点(替代)
x.color = h.color; // x继承h的颜色
h.color = RED; // 将h节点的颜色设置为红色
return x; // 返回x节点作为新的父节点
}
右旋操作与之类似
颜色反转:
左图为颜色翻转前,右图为操作之后,代码如下所示:
private void flipColors(Node h){
assert !isRed(h);
assert isRed(h.left);
assert isRed(h.right);
h.color = RED; // 将父节点颜色改为红色
h.left.color = BLACK; // 将左右子节点颜色改为黑色,
h.right.color = BLACK;
}
此处只实现了查找与插入,如要完整实现所有功能(还有删除),可以采用左倾红黑树(LLRB, Left-leaning red–black tree)
红黑树显示的demo
Reference
2-3 树/红黑树(red-black tree)的更多相关文章
- 树-红黑树(R-B Tree)
红黑树概念 特殊的二叉查找树,每个节点上都有存储位表示节点的颜色是红(Red)或黑(Black).时间复杂度是O(lgn),效率高. 特性: (1)每个节点或者是黑色,或者是红色. (2)根节点是黑色 ...
- 浅谈AVL树,红黑树,B树,B+树原理及应用(转)
出自:https://blog.csdn.net/whoamiyang/article/details/51926985 背景:这几天在看<高性能Mysql>,在看到创建高性能的索引,书上 ...
- 笔试算法题(51):简介 - 红黑树(RedBlack Tree)
红黑树(Red-Black Tree) 红黑树是一种BST,但是每个节点上增加一个存储位表示该节点的颜色(R或者B):通过对任何一条从root到leaf的路径上节点着色方式的显示,红黑树确保所有路径的 ...
- 浅谈AVL树,红黑树,B树,B+树原理及应用
背景:这几天在看<高性能Mysql>,在看到创建高性能的索引,书上说mysql的存储引擎InnoDB采用的索引类型是B+Tree,那么,大家有没有产生这样一个疑问,对于数据索引,为什么要使 ...
- AVL树,红黑树
AVL树 https://baike.baidu.com/item/AVL%E6%A0%91/10986648 在计算机科学中,AVL树是最先发明的自平衡二叉查找树.在AVL树中任何节点的两个子树的高 ...
- B树、B-树、B+树、B*树 红黑树
转载自:http://blog.csdn.net/quitepig/article/details/8041308 B树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right): ...
- C# 链表 二叉树 平衡二叉树 红黑树 B-Tree B+Tree 索引实现
链表=>二叉树=>平衡二叉树=>红黑树=>B-Tree=>B+Tree 1.链表 链表结构是由许多节点构成的,每个节点都包含两部分: 数据部分:保存该节点的实际数据. 地 ...
- B树 B+树 红黑树
B-Tree(B树) 具体讲解之前,有一点,再次强调下:B-树,即为B树.因为B树的原英文名称为B-tree,而国内很多人喜欢把B-tree译作B-树,其实,这是个非常不好的直译,很容易让人产生误解. ...
- 红黑树(R-B Tree)
R-B Tree简介 R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树.红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black). ...
随机推荐
- java反射的补充:桥接方法以及Spring中一些工具类
在上一篇博文中:http://www.cnblogs.com/guangshan/p/4660564.html 源码中有些地方用到了 this.bridgedMethod = BridgeMethod ...
- Rabbimq必备基础之对高级消息队列协议AMQP分析及Rabbitmq本质介绍
MQ的一个产品... [消息队列] 1. MSMQ windows自带的一个服务... [petshop],message存放在文件系统中. 最原始的消息队列... [集群,消息确认,内存化,高可用, ...
- EF:无法检查模型兼容性,因为数据库不包含模型元数据。
Model compatibility cannot be checked because the database does not contain model metadata. Model ...
- 配合前端开发,调试前端页面bug
同事开发的H5页面 在iOS10.1的手机上会有bug 先下载ios10.1的模拟器,安装到xcode上,注意给电脑腾出足够的空间 https://stackoverflow.com/questio ...
- Vagrant更改默认的SSH端口
Vagrant默认转发宿主的2222端口到虚拟机的22端口(默认设置,无须配置).在有多个虚拟机并存的情况下,2222端口将不好使.具体表现在: 启动第二个虚拟机的时候,会报端口占用错误: $ vag ...
- Major compaction时的scan操作
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u014393917/article/details/24419355 Major compactio ...
- input 实现onchange效果
$(".selected input").on('input',function(e){ cc.search(); });
- Linux常用运维指令
cd data/apps./=========================================== ps -ef | grep tomcatps -ef | grep desktopX ...
- SQL语句insert into 不存在则插入,存在则修改
一 测试表的创建 -- ---------------------------- -- Table structure for User -- ---------------------------- ...
- git 使用技巧之采用别名,简化命令
git config --global alias.st status git config --global alias.ci commit git config --global alias.co ...