https://github.com/xieqing/red-black-tree

A Red-black Tree Implementation In C

There are several choices when implementing red-black trees:

  • store parent reference or not
  • recursive or non-recursive (iterative)
  • do top-down splits or bottom-up splits (only when needed)
  • do top-down fusion or top-bottom fusion (only when needed)

This implementation's choice:

  • store parent reference
  • non-recursive (iterative)
  • do bottom-up splits (only when needed)
  • do top-bottom fusion (only when needed)

Files

  • rb.h - red-black tree header
  • rb.c - red-black tree library
  • rb_data.h - data header
  • rb_data.c - data library
  • rb_example.c - example code for red-black tree application
  • rb_test.c - unit test program
  • rb_test.sh - unit test shell script
  • README.md - implementation note

If you have suggestions, corrections, or comments, please get in touch with xieqing.

DEFINITION

A red-black tree is a binary search tree where each node has a color attribute, the value of which is either red or black. Essentially, it is just a convenient way to express a 2-3-4 binary search tree where the color indicates whether the node is part of a 3-node or a 4-node. 2-3-4 trees and red-black trees are equivalent data structures, red-black trees are simpler to implement, so tend to be used instead.

Binary search property or order property: the key in each node must be greater than or equal to any key stored in the left sub-tree, and less than or equal to any key stored in the right sub-tree.

In addition to the ordinary requirements imposed on binary search trees, we make the following additional requirements of any valid red-black tree.

Red-black properties:

  1. Every node is either red or black.
  2. The root and leaves (NIL's) are black.
  3. Parent of each red node is black.
  4. Both children of each red node are black.
  5. Every path from a given node to any of its descendant NIL nodes contains the same number of black nodes.

WHY 2-3-4 TREE?

We could only keep binary search tree almostly balanced instead of completely balanced (consider AVL tree as an example). We need at least 1-3 nodes (2-4 children) to keep tree completely balanced.

  1. Binary search tree
  2. 1
  3. / \
  4. / \
  5. 4 9
  6. / \ / \
  7. 3 5 6 nil
  8. 2-3-4 tree
  9. (1)
  10. / \
  11. / \
  12. (3 4 5) (6 9)
  13. / | | \ / | \
  14. nil nil nil nil nil nil nil
  15. 2-children: (1)
  16. 3-children: (6 9)
  17. 4-children: (3 4 5)

Why not 2-5 tree, 2-6 tree...?

2-4 tree will guarantee O(log n) using 2, 3 or 4 subtrees per node, while implementation could be trivial (red-black tree). 2-N (N>4) tree still guarantee O(logn), while implementation could be much complicated.

INSERTION

Insertion into a 2-3-4 tree

split, and insert grandparent node into parent cluster

Insertion into a red-black tree

Insert as in simple binary search tree

  • 0-children root cluster (parent node is BLACK) becomes 2-children root cluster: paint root node BLACK, and done
  • 2-children cluster (parent node is BLACK) becomes 3-children cluster: done
  • 3-children cluster (parent node is BLACK) becomes 4-children cluster: done
  • 3-children cluster (parent node is RED) becomes 4-children cluster: rotate, and done
  • 4-children cluster (parent node is RED) splits into 2-children cluster and 3-children cluster: split, and insert grandparent node into parent cluster

DELETION

Deletion from 2-3-4 tree

  • transfer, and done
  • fuse, and done or delete parent node from parent cluster

Deletion from red-black tree

Delete as in simple binary search tree

  • 4-children cluster (RED target node) becomes 3-children cluster: done
  • 3-children cluster (RED target node) becomes 2-children cluster: done
  • 3-children cluster (BLACK target node, RED child node) becomes 2-children cluster: paint child node BLACK, and done
  • 2-children root cluster (BLACK target node, BLACK child node) becomes 0-children root cluster: done
  • 2-children cluster (BLACK target node, 4-children sibling cluster) becomes 3-children cluster: transfer, and done
  • 2-children cluster (BLACK target node, 3-children sibling cluster) becomes 2-children cluster: transfer, and done
  • 2-children cluster (BLACK target node, 2-children sibling cluster, 3/4-children parent cluster) becomes 3-children cluster: fuse, paint parent node BLACK, and done
  • 2-children cluster (BLACK target node, 2-children sibling cluster, 2-children parent cluster) becomes 3-children cluster: fuse, and delete parent node from parent cluster

References

  1. https://en.wikipedia.org/wiki/Red-black_tree
  2. https://en.wikipedia.org/wiki/2-3-4_tree
  3. https://www.cs.usfca.edu/~galles/visualization/RedBlack.html

License

Copyright (c) 2019 xieqing. https://github.com/xieqing

May be freely redistributed, but copyright notice must be retained.

红黑树(red-black tree)实现记录的更多相关文章

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

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

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

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

  3. 2-3 树/红黑树(red-black tree)

    2-3 tree 2-3树节点: null节点,null节点到根节点的距离都是相同的,所以2-3数是平衡树 2叉节点,有两个分树,节点中有一个元素,左树元素更小,右树元素节点更大 3叉节点,有三个子树 ...

  4. 红黑树(R-B Tree)

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

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

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

  6. 红黑树(RB Tree)

    看到一篇很好的文章 文章来源:http://www.360doc.com/content/15/0730/00/14359545_488262776.shtml 红黑树是一种高效的索引树,多于用关联数 ...

  7. 红黑树(Red-Black tree)

    红黑树又称红-黑二叉树,它首先是一颗二叉树,它具体二叉树所有的特性.同时红黑树更是一颗自平衡的排序二叉树.我们知道一颗基本的二叉树他们都需要满足一个基本性质–即树中的任何节点的值大于它的左子节点,且小 ...

  8. java数据结构——红黑树(R-B Tree)

    红黑树相比平衡二叉树(AVL)是一种弱平衡树,且具有以下特性: 1.每个节点非红即黑; 2.根节点是黑的; 3.每个叶节点(叶节点即树尾端NULL指针或NULL节点)都是黑的; 4.如图所示,如果一个 ...

  9. 吐血整理:二叉树、红黑树、B&B+树超齐全,快速搞定数据结构

    前言 没有必要过度关注本文中二叉树的增删改导致的结构改变,规则操作什么的了解一下就好,看不下去就跳过,本文过多的XX树操作图片纯粹是为了作为规则记录,该文章主要目的是增强下个人对各种常用XX树的设计及 ...

随机推荐

  1. thymeleaf的fragment例子

    fragment介绍 fragment类似于JSP的tag,在html中文件中,可以将多个地方出现的元素块用fragment包起来使用. 定义fragment 新建foot.html文件 <!D ...

  2. 工控随笔_02_西门子_WinCC的IO域利用C脚本返回值

    WinCC的输入输出域用来显示信息或者接受操作人员的输入.当作为显示功能时,只有直接的变量连接 才能正常的显示,如果使用动态对话框进行设置且用了表达式则不能正确显示. 但是有时候我们在WinCC变量管 ...

  3. 使用 FFMPEG 命令为视频嵌入字幕

    有些电影的视频与字幕是分离的,如果在视频中嵌入字幕,那么观看起来会更方便一些,不必在播放前额外去加载字幕文件. 在 Linux 中,可以使用 ffmpeg 命令实现上述功能. ffmpeg -i in ...

  4. 尝试 Markdown 写测试用例

    我的原帖https://testerhome.com/topics/9412 大家都知道我们社区的帖子提倡用Markdown格式编写,正好项目进入稳定期,尝试用Markdown写下测试用例.有几个目的 ...

  5. Selenium之动作链(ActionChains)

    用selenium做自动化,有时候会遇到需要模拟鼠标操作才能进行的情况,比如单击.双击.点击鼠标右键.拖拽等等.而selenium给我们提供了一个类来处理这类事件——ActionChains   se ...

  6. Java BASE58 以及 md5,sha256,sha1

    package cn.ubibi.wsblog.utils; import java.io.UnsupportedEncodingException; import java.math.BigInte ...

  7. Hello_Git!!!(Git的安装)

    Install_Git&Say Hello! Mac与Linux平台  ||最近的Mac平台中都预装了Git,而各个版本的Linux中也都以软件包(Package)的形式提供给了用户,详细请参 ...

  8. Linux裸设备管理详解--

    裸设备概述 裸设备:也叫裸分区(原始分区),是一种没有经过格式化,不被Unix/Linux通过文件系统来读取的特殊字符设备.裸设备可以绑定一个分区,也可以绑定一个磁盘.字符设备:对字符设备的读写不需要 ...

  9. C#中获取文件信息的代码

    如下的内容内容是关于C#中获取文件信息的内容,应该对大伙有一些好处. FileInfo fi = new FileInfo(@"C:file.txt"); if(fi.Exists ...

  10. rabbitmq支持.net framwork 3.5的最后版本

    方便后来人!!!经过一系列的确认!! rabbitmq支持.net framwork 3.5的最后版本是3.4.3, 安装步骤: 1.工具->Nuget程序包管理器,进入控制台 2.Instal ...