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.

    Binary search tree

             1
/ \
/ \
4 9
/ \ / \
3 5 6 nil 2-3-4 tree
(1)
/ \
/ \
(3 4 5) (6 9)
/ | | \ / | \
nil nil nil nil nil nil nil 2-children: (1)
3-children: (6 9)
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. 关于springboot2.x 的 RedisCacheManager变化

    springboot配置缓存过期时间,大部分是使用ReidsCacheManager来进行自定义的配置 以下是大部分网上的代码(这也是基于springboot1.x的版本可以使用的) @Beanpub ...

  2. c# excel如何导入到sqlserver数据库

    最近在做这个如何把excel导入到数据库中,经过多方查找,终于找到一个适合的,并且经过自己的完善可以正常使用(忘记原作者博客的链接地址了,敬请见谅) 首先是窗体的创建,文本框显示文件的路径,按钮执行操 ...

  3. 2018-2019-20175334实验二《Java面向对象程序设计》实验报告

    2018-2019-20175334实验二<Java面向对象程序设计>实验报告 一.实验内容及步骤 实验二面向对象程序设计-1 参考 http://www.cnblogs.com/roce ...

  4. no module named win32api

    1 首先下载pywin32 https://sourceforge.net/projects/pywin32/files/pywin32/ 2进入虚拟环境 D:\env\jdscrapy\Lib\si ...

  5. PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib/php/20151012/php_mbstring.dll' 的解决方法

    step 1: cd /etc/php/{$yourphpversion}/cli step 2: sudo vim php.ini step 3: 在extension=php_mbstring.d ...

  6. spring资源加载结构解析

    1.spring中资源加载使用resources的原因? 在java将不同资源抽象成url,然后通过注册不同的hander来处理不同读取逻辑,一般hander使用协议的前缀来命名,如http,jar, ...

  7. [STM32F103]DMA原理

    DMA配置程序过程 使能DMA时钟 a) RCC_AHBPeriphClockCmd(); 初始化DMA通道参数 a) DMA_Init(); 使能串口DMA发送,串口DMA使能函数: a) USAR ...

  8. 类名:IExternalCommandAvailability+IExternalCommand实现对某些控件的自定义使用

    起初对于这些名词不懂,后经查阅了解如下,希望对学习者能有所帮助.在Revil里大部分命令在没有打开文档的时候是禁用的,有的在没有打开文档也是可以使用的.而又一些在平面视图是禁用的如标高,有的在3D视图 ...

  9. HTML5+CSS3(3)

    一.CSS3新增属性用法整理 1.box-shadow(阴影效果) 2.border-color(为边框设置多种颜色) 3.border-image(图片边框) 4.text-shadow(文本阴影) ...

  10. 国内最全的Spring Boot系列之二

    历史文章 <国内最全的Spring Boot系列之一> 视频&交流平台 SpringBoot视频:http://t.cn/R3QepWG Spring Cloud视频:http:/ ...