算法手札二:红黑树的插入原理,原理与实现篇
- 红黑树的五大性质(性质四与性质五特别重要)
1. 节点必须是红色或者是黑色
2. 根节点是黑色的
3. 所有的叶子节点是黑色的。
4. 每个红色节点的两个子节点是黑色的,也就是不能存在父子两个节点全是红色。
5. 从任意每个节点到其每个叶子节点的所有简单路径上黑色节点的数量是相同的。
以下情况两点说明:
- 新节点是红孩子
- 二叉树的左分支来讨论,右分支相反即可
- 第0种情况:
如果,父亲节点是黑色的,那么,直接插入即可!(如图)
//Segement 1 void RB_Insert_Case0(Node *node) {if( node -> parent -> color == RB_BLACK){return;//树是有效的 }else{RB_Insert_Case1(node);} }
- 第一种情况:
如果,父亲节点是红色的,它的叔叔是红色的,那么,直接把祖父变成红色,然后,父亲与叔叔变成黑色!(如图)
//Segement 2 void RB_Insert_Case1(Node *node) {Noude *uncle = getUncle()node);if( uncle!=null && uncle->color == RB_RED){uncle->color = RB_BLACK;node->paren->color = RB_BLACK;uncle->parent = RB_RED;//GrandParent
init();//所有函数调用完必须重新把root改为黑色. }else{RB_Insert_Case2(node);} }
- 第二种情况:
如果,父亲节点是红色的,它的叔叔是黑色的,那么,新节点是右孩子,则先左旋,变成第三种情况!(如图)
//Segement 3 void RB_Insert_Case2(Node *node) {if( node->paren->rchild == node){Rb_Rotate_Left(node->paren);
init();//所有函数调用完必须重新把root改为黑色. }RB_Insert_Case3(node); }
- 第三种情况:
如果,父亲节点是红色的,它的叔叔是黑色的,那么,节点是左孩子,则进行以(祖父的节点)向右转!(如图)
void RB_Insert_Case3(Node *node) {Node *parent = node->parent;Node *grandp = parent -> parent;parent -> color = RB_RED;grandp -> color = RB_RED;Rb_Rotate_Right(grandp);init();//所有函数调用完必须重新把root改为黑色. }
- 结束语
红黑树,是个伟大的算法,我一直对这个算法保持着高度的尊敬,因为,太高效了,我们可以有个简单证明,把红黑树的红节点合并到黑节点
就会出现2-3-4树,从而得出一个公式2^h≤n+1≤4^h,而且,可以根据性质4得知树的高度最多是2h,而h=lg(n+1)(刚才的公式取对数)最
坏的情况都是对数,可见其好处!可以见到应用于:stl的set map java的set map!
有错误请指出,转载请注明,谢谢!O(∩_∩)O
转载于:https://www.cnblogs.com/courtier/p/4266610.html
算法手札二:红黑树的插入原理,原理与实现篇相关推荐
- 红黑树详解(二)红黑树的插入(附动图和案例)
红黑树详解(二)红黑树的插入(附动图和案例) 摘要: 在很多源码涉及到大量数据处理的时候,通常都是用红黑树这一数据结构.红黑树是一种自平衡的二叉查找树,它能在进行插入和删除操作时通过特定操作保持二叉查 ...
- 红黑树从头至尾插入和删除结点的全程演示图
红黑树插入和删除结点的全程演示 作者:July.saturnman. 时间:二零一一年三月二十八日. 出处:http://blog.csdn.net/v_JULY_v. 声明:版权所有,侵权必究. - ...
- 《算法导论》红黑树详解(一):概念
在学习红黑树之前,读者应先掌握二叉查找树的相关知识.学习红黑树或者二叉查找树,推荐大家看<算法导论>.<算法导论>原书第3版 高清PDF 带详细书签目录下载 密码:acis & ...
- 【数据结构和算法05】 红-黑树(转发)
2019独角兽企业重金招聘Python工程师标准>>> [数据结构和算法05] 红-黑树(看完包懂~) 置顶 2016年04月13日 15:50:25 eson_15 阅读数:526 ...
- 红黑树及其插入、删除操作
在二叉搜索树中,基本操作如结点的插入.删除.查找的性能上界都得不到保证,原因在于二叉搜索树的构造依赖于其结点值的插入顺序,最坏情况下二叉搜索树会退化为单链表(如下图所示).因此我们需要对二叉搜索树做出 ...
- 红黑树检索/插入/删除
正文 红黑树也是二叉查找树,我们知道,二叉查找树这一数据结构并不难,而红黑树之所以难是难在它是自平衡的二叉查找树,在进行插入和删除等可能会破坏树的平衡的操作时,需要重新自处理达到平衡状态.现在在脑海想 ...
- 白话红黑树系列之二——红黑树的构建
上一篇写了关于红黑树基本性质的东西,这篇来说一说如何创建一棵红黑树吧. 如果对红黑树的基本性质还有疑问,请先查看一下我的前一篇:http://www.cnblogs.com/unpolishedgem ...
- 算法导论之红黑树的学习
最近学习了二叉搜索树中的红黑树,感觉收获颇丰,在此写一篇文章小结一下学到的知识,顺便手写一下Java代码. 1.引言 先来讲讲什么是二叉搜索树,二叉搜索树有如下特点:他是以一颗二叉树(最多有两个子结点 ...
- Python实现红黑树的插入操作
Python实现红黑树的插入操作 本专栏中的上一篇文章介绍了什么是红黑树,以及红黑树的旋转和变色. 参考:https://blog.csdn.net/weixin_43790276/article/d ...
最新文章
- memset函数使用详解
- linux 生成dll文件,Linux和Windows平台 动态库.so和.dll文件的生成
- .NET程序员迈向卓越的必由之路
- virtualbox+vagrant学习-2(command cli)-20-vagrant suspend命令
- 编写下载服务器。 第二部分:标头:Last-Modified,ETag和If-None-Match
- redis 多线程_唬人的Redis多线程,也就那么回事
- 前端构建工具与应用程序测试
- 以自己范例,说明如何写操作文档
- DBSCAN聚类算法C++实现
- 微信群打卡小程序_签到打卡小程序,哪个更适合你?
- 《鸟哥 Linux 私房菜》560 页新书首发!完整中文版 PDF 下载
- PHP strpos
- Matlab 向量的处理
- 如何有效的快速处理恶意差评?
- A new deep transfer learning network based on convolutional auto-encoder for mechanical fault diagno
- 私有化场景下大规模云原生应用的交付实践
- PLC需要有什么样的基础才能学?
- 制作Win10系统U盘,安装纯净版Win10系统教程
- GitHub 术语解释
- 常见的有利健康的蔬菜