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))

特性:

  1. 每个节点有一个颜色属性(红或黑)
  2. 根节点是黑色的
  3. 所有的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

  1. wikipedia Red–black tree

2-3 树/红黑树(red-black tree)的更多相关文章

  1. 树-红黑树(R-B Tree)

    红黑树概念 特殊的二叉查找树,每个节点上都有存储位表示节点的颜色是红(Red)或黑(Black).时间复杂度是O(lgn),效率高. 特性: (1)每个节点或者是黑色,或者是红色. (2)根节点是黑色 ...

  2. 浅谈AVL树,红黑树,B树,B+树原理及应用(转)

    出自:https://blog.csdn.net/whoamiyang/article/details/51926985 背景:这几天在看<高性能Mysql>,在看到创建高性能的索引,书上 ...

  3. 笔试算法题(51):简介 - 红黑树(RedBlack Tree)

    红黑树(Red-Black Tree) 红黑树是一种BST,但是每个节点上增加一个存储位表示该节点的颜色(R或者B):通过对任何一条从root到leaf的路径上节点着色方式的显示,红黑树确保所有路径的 ...

  4. 浅谈AVL树,红黑树,B树,B+树原理及应用

    背景:这几天在看<高性能Mysql>,在看到创建高性能的索引,书上说mysql的存储引擎InnoDB采用的索引类型是B+Tree,那么,大家有没有产生这样一个疑问,对于数据索引,为什么要使 ...

  5. AVL树,红黑树

    AVL树 https://baike.baidu.com/item/AVL%E6%A0%91/10986648 在计算机科学中,AVL树是最先发明的自平衡二叉查找树.在AVL树中任何节点的两个子树的高 ...

  6. B树、B-树、B+树、B*树 红黑树

    转载自:http://blog.csdn.net/quitepig/article/details/8041308 B树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right): ...

  7. C# 链表 二叉树 平衡二叉树 红黑树 B-Tree B+Tree 索引实现

    链表=>二叉树=>平衡二叉树=>红黑树=>B-Tree=>B+Tree 1.链表 链表结构是由许多节点构成的,每个节点都包含两部分: 数据部分:保存该节点的实际数据. 地 ...

  8. B树 B+树 红黑树

    B-Tree(B树) 具体讲解之前,有一点,再次强调下:B-树,即为B树.因为B树的原英文名称为B-tree,而国内很多人喜欢把B-tree译作B-树,其实,这是个非常不好的直译,很容易让人产生误解. ...

  9. 红黑树(R-B Tree)

    R-B Tree简介 R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树.红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black). ...

随机推荐

  1. union 和 all union

    sql union用法和sql union all用法,sql union效率 1.sql union用法 sql union在查询中可以将两个SQL 语句的结果合并起来.如果这样看的话, UNION ...

  2. struts2把表单数据封装到实体类里

    <form method="post" action=""> <input type="text" name=" ...

  3. 【08】循序渐进学 docker:docker compose

    写在前面的话 在之前的操作中,即使是单个容器每次都需要敲很长的命令,当需要多个容器组合着用的时候更加麻烦,此时我们急需找到一种一次配置,随便运行的方法. 这就是这一节重点,单机容器编排工具:docke ...

  4. [Objective-C语言教程]程序结构(3)

    1. Objective-C Hello World示例 Objective-C程序基本上由以下部分组成 - 预处理程序命令 接口 实现 方法 变量 声明和表达 注释 下面来看一下打印“Hello W ...

  5. js计算器案例

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>j ...

  6. 你不可不知的数据库northwind

    说起northwind,40左右的大年一定不会陌生,它是著名的northwind示例库,在SQL Server 是标配. 它有8张表,涉及客户.商品.订单. 如果你是有志从事企业级应用开发,或有志从事 ...

  7. C#-★结构体★

    结构体: 结构体类型是用户自己定义的一种类型,它是由其他类型组合而成的,可包含构造函数.常数.字段.方法.属性.索引器.运算符.事件和嵌套类型的值类型. 结构体在几个方面不同于类:结构体为值类型而不是 ...

  8. mysql 存储过程和游标

    CREATE DEFINER=`root`@`localhost` PROCEDURE `NewProc`() BEGIN #Routine body goes here... DECLARE ite ...

  9. Ant demo

    <?xml version="1.0" encoding="UTF-8"?> <!-- 定义一个工程,默认任务为warFile. --> ...

  10. mfix18.1.1的cmake编译相关问题

    今天把mfix-18.1.1\model\monitors里的文件拷到当前工作目录,进行修改编译,发现修改后运行发现并没有出现任何修改后的效果,发现这几个文件只有在原始目录里修改的才起作用,拷贝到当前 ...