红黑树(red-black tree)实现记录
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:
- Every node is either red or black.
- The root and leaves (NIL's) are black.
- Parent of each red node is black.
- Both children of each red node are black.
- 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
- https://en.wikipedia.org/wiki/Red-black_tree
- https://en.wikipedia.org/wiki/2-3-4_tree
- 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)实现记录的更多相关文章
- 笔试算法题(51):简介 - 红黑树(RedBlack Tree)
红黑树(Red-Black Tree) 红黑树是一种BST,但是每个节点上增加一个存储位表示该节点的颜色(R或者B):通过对任何一条从root到leaf的路径上节点着色方式的显示,红黑树确保所有路径的 ...
- C# 链表 二叉树 平衡二叉树 红黑树 B-Tree B+Tree 索引实现
链表=>二叉树=>平衡二叉树=>红黑树=>B-Tree=>B+Tree 1.链表 链表结构是由许多节点构成的,每个节点都包含两部分: 数据部分:保存该节点的实际数据. 地 ...
- 2-3 树/红黑树(red-black tree)
2-3 tree 2-3树节点: null节点,null节点到根节点的距离都是相同的,所以2-3数是平衡树 2叉节点,有两个分树,节点中有一个元素,左树元素更小,右树元素节点更大 3叉节点,有三个子树 ...
- 红黑树(R-B Tree)
R-B Tree简介 R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树.红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black). ...
- 树-红黑树(R-B Tree)
红黑树概念 特殊的二叉查找树,每个节点上都有存储位表示节点的颜色是红(Red)或黑(Black).时间复杂度是O(lgn),效率高. 特性: (1)每个节点或者是黑色,或者是红色. (2)根节点是黑色 ...
- 红黑树(RB Tree)
看到一篇很好的文章 文章来源:http://www.360doc.com/content/15/0730/00/14359545_488262776.shtml 红黑树是一种高效的索引树,多于用关联数 ...
- 红黑树(Red-Black tree)
红黑树又称红-黑二叉树,它首先是一颗二叉树,它具体二叉树所有的特性.同时红黑树更是一颗自平衡的排序二叉树.我们知道一颗基本的二叉树他们都需要满足一个基本性质–即树中的任何节点的值大于它的左子节点,且小 ...
- java数据结构——红黑树(R-B Tree)
红黑树相比平衡二叉树(AVL)是一种弱平衡树,且具有以下特性: 1.每个节点非红即黑; 2.根节点是黑的; 3.每个叶节点(叶节点即树尾端NULL指针或NULL节点)都是黑的; 4.如图所示,如果一个 ...
- 吐血整理:二叉树、红黑树、B&B+树超齐全,快速搞定数据结构
前言 没有必要过度关注本文中二叉树的增删改导致的结构改变,规则操作什么的了解一下就好,看不下去就跳过,本文过多的XX树操作图片纯粹是为了作为规则记录,该文章主要目的是增强下个人对各种常用XX树的设计及 ...
随机推荐
- 13行代码实现:Python实时视频采集(附源码)
一.前言 本文是<人脸识别完整项目实战>系列博文第3部分:程序设计篇(Python版),第1节<Python实时视频采集程序设计>,本章内容系统介绍:基于Python+open ...
- RN 获取组件的宽度和高度
https://www.cnblogs.com/zhiyingzhou/p/7471212.html https://blog.csdn.net/calvin_zhou/article/details ...
- 使用Dockerfile创建镜像
Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile来快速创建自定义的镜像. 一.基本结构 Dockerfile由一行行命令语句组成,并且支持以#开头的注释行. 一般而言,D ...
- Linux系统编程——fcntl
fcntl可实现对指定文件描述符的各种操作,其函数原型如下: int fcntl(int fd, int cmd, ... /* arg */ ); 头文件 #include <unistd.h ...
- python科学计算包numpy用法(一)
numpy是python中一个用来做科学计算的包,用起来十分方便,下面是我总结的numpy的用法: 1.如何创建矩阵 创建矩阵有很多种方法,主要包括以下几种: 通过array函数创建 >> ...
- Google瓦片地图URL
http://mt2.google.cn/vt/lyrs=y&scale=2&hl=zh-CN&gl=cn&x=6891&y=3040&z=13 //含 ...
- 编译问题:'<invalid-global-code>' does not contain a definition for 'Store' and no extension method 'XXX' accepting a first argument of type '<invalid-global-code>' could be found
这是VS2015上的bug. 我碰到的时候,是VS在合并两个分支的代码时,多加了一个}.导致编译语法报错.. 解决办法就是在错误的附近,找找有没有多余的大括号,删掉即可. 这个问题在vs2017上面没 ...
- Windows和MacOS的比较——不断完善和补充,欢迎吐槽
1. 鼠标滚轮的方向不一样,Windows上滚轮朝下,页面滚动条也会朝下.而Mac上则相反. 2. Windows上有Home和End键,经常可以Ctrl+Home,Ctrl+End,Ctrl+Shi ...
- selenium测瀑布流UI页面的Python代码
from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdri ...
- localStorage sessionStorage 用法
sessionStorage.getItem('key') // 获取 sessionStorage.setItem('key','value') //设置 sessionStorage.remove ...