2-3 树/红黑树(red-black tree)
2-3 tree
**2-3树节点**:
1. null节点,null节点到根节点的距离都是相同的,所以2-3数是平衡树
2. 2叉节点,有两个分树,节点中有一个元素,左树元素更小,右树元素节点更大
3. 3叉节点,有三个子树,节点中有两个元素,左树元素更小,右树元素更大,中间树介于两个父元素之间。
![2叉节点](https://i.imgur.com/rfAJOPK.png) ![3叉节点](https://i.imgur.com/aqNFC10.png)
插入操作如下图所示
![2-3tree插入操作](https://i.imgur.com/MkuZR33.png)
红黑树
红黑树可以理解为实现了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). ...
随机推荐
- python变量和简单的数据类型
1.运行hello_world.py时发生的情况 运行hello_world.py时,Python都做了些什么呢?实际上,即便是运行简单的程序,Python所做的工作也相当多: #!/usr/bin/ ...
- 多线程“尚未调用coinitialize” 报错
关于多线程中创建使用TADOConnect.TADODataSet等Com组件时,必须先初始化Com 在多线程启用执行前 CoInitialize(nil); 在多线程启用执行后 CoUninitia ...
- Android-自定义进度条
圆形进度条,不确定进度条: <!-- 原生圆形进度条 不确定进度条 --> <ProgressBar android:layout_width="wrap_content& ...
- Java50道经典习题-程序3 打印水仙花数
题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身.例如:153是一个"水仙花数",因为153=1 ...
- 利用PhotoShop对大图像进行等分切片
图文介绍利用PhotoShop等分切图 1.调用切片工具,右键选择划分切片 2.指定水平划分.垂直划分的等分数量,点击确定 3.在文件菜单中选择存储为... 4.配置图像质量参数.点击存储.指定存储位 ...
- .net core i上 K8S(三)Yaml文件运行.netcore程序
上一章我们通过kubectl run简单运行了一个.netcore网站,但实际的开发中,我们都是通过yaml来实现的. 1.编写yaml文件 关于yaml文件的格式在此就不多描述了,不熟悉的可以去网上 ...
- ASP.NET Core入门(一)
大家好,很荣幸您点了开此篇文章,和我一起来学习ASP.NET Core,此篇文字为<ASP.NET Core入门>系列中的第一篇,本系列将以一个博客系统为例,从第一行代码,到系统发布上线( ...
- 云课堂Android模块化实战--如何设计一个通用性的模块
本文来自 网易云社区 . 如何设计一个通用性的模块 前言 每个开发者都会知道,随着项目的开发,会发现业务在不断壮大,产品线越来越丰富,而留给开发的时间却一直有限,在有限的时间,尽快完成某个功能的迭代. ...
- java 程序设计第一次作业
public class Join{ public static void main(String args[]){ String s1=new String("hello"); ...
- windows系统作为客户端时,linux中本地yum源挂载时,如何同时挂载DVD1和DVD2?
这里以CentOS6.5为例.他的镜像有两个DVD1和DVD2.DVD1中是系统和主要的安装包,DVD2中是剩下的安装包 当挂载时如果要同时挂载DVD1和DVD2.需要这样做: 1)在虚拟机的设置中选 ...