红黑树新解(插入)

1.  简介

红黑树是一种自平衡二叉查找树,在查找,插入和删除几个方面,性能都可以做到O(lgN)。

那怎么实现呢,首先要先看看红黑树的5个特性,只有满足这5个特性,才是红黑树。

每个结点都有父结点(parent),左子结点(left)和右子结点(right), root的父结点是leaf结点。

下图便是一个简单的红黑树,

60为根结点,60的左子结点为30,60的右子结点为80,60的父结点为leaf结点;

30的父结点为60,30的左子结点和右子结点为leaf结点;

80的父结点为60,80的左子结点和右子结点为leaf结点;

为了简洁,后续图片将不显示leaf结点和left,right和parent关系描述。

2.旋转

在插入和删除元素的时候,都会用到旋转,所以有必要先介绍一下。

2.1 左转

比如选定一结点60,进行左转,实际是将xl转成x.right的left,有点绕,看图和代码就清楚了。

RBNode y = x.right;
x.right = y.left;
if(y.left != leaf)                  y.left.parent = x;

y.parent = x.parent;

if(x.parent == leaf)                root = y;
else if(x.parent.left == x)         x.parent.left = y;
else if(x.parent.right == x)        x.parent.right = y;

y.left = x;
x.parent = y;

这只是一个示例,左转必须要按照一定规律来转,随便转肯定会出事,在插入时将会告诉你什么时候才能转。

2.2 右转

比如选定一点结点60,进行右转:

RBNode y = x.left;
x.left = y.right;
if(y.right != leaf)  y.right.parent = x;
y.parent = x.parent;
if(x.parent == leaf)            root = y;
else if(x.parent.left == x)     x.parent.left = y;
else x.parent.right = y;
y.right = x;
x.parent = y;

3.插入

现在,我们正式进入主题,元素插入后,如何进行调整,变成一颗合格的红黑树呢。以下我们将会用一些示例来讲解。

3.1 元素插入

在二叉树中插入{key:value.hashCode,value},该逻辑简单,略过,如不明白可看后面的源代码。

约定:

1.新插入的结点都为红色。

2. 某结点的左子结点指向leaf,可以说成左子结点不存在,或者没有左子结点

3. 某结点的左子结点指向leaf,可以说成左子结点存在,或者有左子结点

4.某结点的右子结点指向leaf,可以说成右子结点不存在,或者没有右子结点

4.某结点的右子结点指向leaf,可以说成右子结点存在,或者有右子结点

特殊场景的先决条件是:当前结点与父结点都为红色。

插入有几个特殊场景需要特别处理:

3.1.1  Case1 祖父孙 单减

转变后父结点黑色,子结点红色

3.1.2 Case2 祖父孙结点单增

转变后父结点黑色,子结点红色

3.1.3 Case3 叔结点为红色

3.1.4 Case4 当前结点为右子结点,父结点为左结点,叔结点没有或者黑色

3.1.5 Case5 当前结点为右子结点,父结点为左结点,叔结点没有或者黑色

原文地址:https://www.cnblogs.com/liufu627/p/12129791.html

时间: 2024-10-09 18:34:42

红黑树新解(插入)的相关文章

红黑树的插入

一.红黑树的介绍 先来看下算法导论对R-B Tree的介绍: 红黑树,一种二叉查找树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black.通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的. 前面说了,红黑树,是一种二叉查找树,既然是二叉查找树,那么它必满足二叉查找树的一般性质.下面,在具体介绍红黑树之前,咱们先来了解下 二叉查找树的一般性质:1.在一棵二叉查找树上,执行查找.插入.删除等操作,的时间复杂度为O(

红黑树的插入和删除

一.红黑树的简介 红黑树是一种平衡的二叉查找树,是一种计算机科学中常用的数据结构,最典型的应用是实现数据的关联,例如map等数据结构的实现. 红黑树有以下限制: 1. 节点必须是红色或者是黑色 2. 根节点是黑色的 3. 所有的叶子节点是黑色的. 4. 每个红色节点的两个子节点是黑色的,也就是不能存在父子两个节点全是红色 5. 从任意每个节点到其每个叶子节点的所有简单路径上黑色节点的数量是相同的. 要说明一下限制3.一般在红黑树中,每个节点空指针处还会加空的黑色的孩子(称为岗哨).所以限制3一定

红黑树之插入

1.红黑树 (1).概念 i>每个结点不是红的就是黑的: ii>根结点为黑的: iii>红结点的孩子必为黑结点: iv>(除了根结点)任一结点不管通过什么路径,到达叶子节点的黑结点数目一定相同: 总结概括:一头一脚黑,黑同红不连:根为黑,到脚(叶子节点)的黑结点相同,红结点不相连: 2.递归--->一般先写if结束语句 化非递归------>用while()循环和栈; enum{RED, BLACK}; 这个枚举是有值得,分别为0.1: 3.红黑树与AVL树  AVL树

红黑树(2) - 插入操作

1.插入介绍 首先以二叉排序树的方法增加节点并标记它为红色.(为何不是红色?因为如果设为黑色,就会导致根到叶子的所有路径中,有一条路径上会多出一个额外的黑节点,这个是很难调整的).但是,设为红色节点后,可能会导致出现两个连续红色节点的冲突,则可以通过重新着色和旋转来调整.具体的调整操作取决于其他临近节点的颜色. 下面分析一下插入新节点后可能对红黑树性质产生的影响: 性质1-节点是红色或黑色.和性质3-所有叶子都是黑色.这两条总是可以维持不变. 性质4-每个红色节点的两个子节点都是黑色.只在增加红

红黑树的插入与删除

红黑树(Red Black Tree) 是一种自平衡二叉查找树.红黑树和AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能.红黑树可以在O(log n)时间内完成查找,插入和删除操作. 二叉搜索树可以看 二叉搜索树 AVL树可以看 AVL树的插入与删除 1. 红黑树的性质 红黑树的自平衡依赖于它的以下性质: 性质1. 结点是红色或黑色. 性质2. 根结点是黑色. 性质3. 每个结点节点(NIL结点,空结点,与其它二叉搜索树不同,红黑树将叶子结点的孩子

图解集合7:红黑树概念、红黑树的插入及旋转操作详细解读

原文地址http://www.cnblogs.com/xrq730/p/6867924.html,转载请注明出处,谢谢! 初识TreeMap 之前的文章讲解了两种Map,分别是HashMap与LinkedHashMap,它们保证了以O(1)的时间复杂度进行增.删.改.查,从存储角度考虑,这两种数据结构是非常优秀的.另外,LinkedHashMap还额外地保证了Map的遍历顺序可以与put顺序一致,解决了HashMap本身无序的问题. 尽管如此,HashMap与LinkedHashMap还是有自己

红黑树从头至尾插入和删除结点的全程演示图

红黑树插入和删除结点的全程演示 作者:July.saturnman.时间:二零一一年三月二十八日.出处:http://blog.csdn.net/v_JULY_v.声明:版权所有,侵权必究.----------------------------------- 引言: 目前国内图书市场上,抑或网上讲解红黑树的资料层次不齐,混乱不清,没有一个完整而统一的阐述.而本人的红黑树系列四篇文章(详见文末的参考文献),虽然从头至尾,讲的有根有据,层次清晰,然距离读者真正做到红黑树了然于胸,则还缺点什么. 而

红黑树的插入和遍历时间复杂度分析

红黑树的插入和遍历时间复杂度分析 在平常的工作中,最常用的一种数据结构恐怕是std::map了.因此对其的时间复杂度分析是有必要的,编写程序时做到心中有底. 一.理论分析 在stl中std::map和std::set都采用红黑树的方式实现.我们知道插入一个元素到红黑树的时间为log(N),其中N为当前红黑树的元素个数,因此,采用插入方式构建元素个数为N的红黑树的时间复杂度为: log(1) + log(2) + log(N-1) = log((N-1)!) = Nlog(N) 那么采用迭代器遍历

红黑树的插入操作

1 package Tree; 2 3 import org.junit.Test; 4 5 class RedBlackTreeNode { 6 7 int key = 0; 8 RedBlackTreeNode left = null; 9 RedBlackTreeNode right = null; 10 RedBlackTreeNode parent = null; 11 // 色域,0表示黑色,1表示红色 12 int color; 13 14 public RedBlackTreeN