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). ...
 
随机推荐
- Android-Handler+Message-消息机制
			
我的理解是,子线程要和主线程通讯,就需要Handler+Message-消息机制 案例一:倒计时Demo(子线程+Handler+Message) package liudeli.async; imp ...
 - 我眼中的SAML (Security Assertion Markup Language)
			
提到SAML (Security Assertion Markup Language), 很多人都会联想到单点登录SSO.那么Saml到底是什么,它跟sso到底有什么联系?这里给大家分享一下我在读完了 ...
 - uni-app开发踩坑记录
			
大部分问题是我在h5端看不到而在android.iOS平台上暴露出来的,不包含小程序 1.:class="['defaultStyle', dynamicStyle]" 不支持直接 ...
 - Linux下卸载删除.Net Core
			
最近在技术博客和技术交流群遇到很多小伙伴们在Linux下更新或者安装.Net Core SDK后dotnet命令无法识别等问题,现如下解决: 卸载SDK命令 sudo yum remove dotne ...
 - C# 异常日志记录
			
using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Web; na ...
 - Centos7.6下使用docker方法安装stf
			
使用Docker镜像安装 一,在centos上安装Docker 很简单,直接 yum install docker 即可开启docker服务 在centos中开启服务可以使用systemctl sta ...
 - mysql 启动提示:错误2系统找不到指定文件
			
详情见这个方法 其实就是更改了启动目录导致的 https://blog.csdn.net/su749520/article/details/78963878
 - python 小点
			
python中列表不能除以列表,列表不能除以整数.浮点数. numpy数组可以实现数组除以整数.
 - “全栈2019”Java第二十二章:控制流程语句中的决策语句if-else
			
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
 - 洛谷P5050 【模板】多项式多点求值
			
传送门 人傻常数大.jpg 因为求逆的时候没清零结果调了几个小时-- 前置芝士 多项式除法,多项式求逆 什么?你不会?左转你谷模板区,包教包会 题解 首先我们要知道一个结论\[f(x_0)\equiv ...