【算法】红黑树插入数据(变色,左旋、右旋)(二)
本人菜鸡一只,正在更新红黑树系列的文章。
该系列已经全部更完,有5篇文章:
【算法】红黑树(二叉树)概念与查询(一):https://blog.csdn.net/lsr40/article/details/85230703
【算法】红黑树插入数据(变色,左旋、右旋)(二):https://blog.csdn.net/lsr40/article/details/85245027
【算法】红黑树插入数据的情况与实现(三):https://blog.csdn.net/lsr40/article/details/85266069
【算法】红黑树删除数据(寻找继承人)(四):https://blog.csdn.net/lsr40/article/details/85322371
【算法】红黑树删除数据(最后一步,平衡红黑树)(五):https://blog.csdn.net/lsr40/article/details/86711889
如果想要在查询的时候能够使用到红黑树的查询优化的时候,必须把数据先加载到红黑树中,加载到红黑树中其实就是put,就是一个构建红黑树的过程!
学习怎么构建红黑树之前,我们必须掌握几个基本的知识!
1、红黑树在插入数据的时候,会先遍历数据应该插入到哪个位置,插入的位置肯定在底部,不可能在中间突然插入一个值。
2、插入的数据一定是红色的(因为要遵守红黑树的第五条规则,如果有一条分支增加了一个黑色节点,就会打破该规则)
3、插入之后,为了满足规则4,就需要用到换色与左旋、右旋的操作了
换色,其实就是红变黑,黑变红,只需要让某个对象的属性改变就可以了,没什么好说的。
重要的是什么是旋转,为什么要旋转,什么时候选择左旋,什么时候旋转右旋?
1、旋转分两种:
-1.左旋
大家看如下三张图,对于x做左旋
原始的样子:
正在变换:
变换结束:
-2.右旋
大家看如下三张图,对于y做右旋
原始的样子:
正在变换:
变换结束:
所以,我们发现左旋和右旋是一个相对的操作。
关于红黑树旋转的代码,其实很简单,我大概说一下如何实现,其实每个节点有这么几个属性:
1、父节点的指向
2、子节点的指向(有两个,一个左子节点,一个右子节点)
3、该节点的颜色
4、该节点存储的value(当然如果是map,那就是该节点的key和value都要存,然后按照key的大小来插入新节点)
所以当我们做旋转的时候,只需要把该节点的父节点指向该节点的子节点,然后把子节点的一条腿接到该节点上。
详情看TreeMap的源码:
左旋转我加了中文注释,大家可以对照,我上面画的左旋转的图去理解旋转的过程,java如何实现
/** From CLR */
//从TreeMap类中的2221行开始private void rotateLeft(Entry<K,V> p) {//这里的p就是图中绿色的xif (p != null) {//r就是图中的yEntry<K,V> r = p.right;//x.right变成y.leftp.right = r.left;//如果y的左腿不为空if (r.left != null)//设置y.left的父节点为x(必须双向设置)r.left.parent = p;//x的父节点,变成了y的父节点r.parent = p.parent;//如果x的父节点为空,证明x就是根节点if (p.parent == null)//那么y就变成了根节点root = r;//如果x是父亲的左子节点,x的父亲的左子节点就变成了yelse if (p.parent.left == p)p.parent.left = r;else//否则x就是父亲的右子节点,x的父亲的右子节点就变成了yp.parent.right = r;//x变成了y的左子节点r.left = p;//x的父亲变成了yp.parent = r;}}/** From CLR */private void rotateRight(Entry<K,V> p) {if (p != null) {Entry<K,V> l = p.left;p.left = l.right;if (l.right != null) l.right.parent = p;l.parent = p.parent;if (p.parent == null)root = l;else if (p.parent.right == p)p.parent.right = l;else p.parent.left = l;l.right = p;p.parent = l;}}
当然,到现在我们还不知道到底为什么要旋转?
欲知后事如何,且看下回分解!
本人菜鸡一只,如果有笔误或者自己理解的不到位的地方,还请各位看官批评指出,避免写出不严谨,甚至误导新人的文章!!
【算法】红黑树插入数据(变色,左旋、右旋)(二)相关推荐
- HashMap 数据结构之红黑树, 红黑树在什么时候左旋 右旋 如何旋转
树结构是数据结构中最经典最常用的结构之一,也是面试中常问的面试题,最近学习了一下红黑树的知识,记录整理一下 文章目录 一.红黑树的特征 二.变色左旋和右旋 1.变色规则 2.左旋 3.右旋 总结 前言 ...
- nyoj202 红黑树 (二叉树的左旋右旋)
题目202 题目信息 运行结果 本题排行 讨论区 红黑树 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 什么是红黑树呢?顾名思义,跟枣树类似,红黑树是一种叶子是黑色果子 ...
- 红黑树的基本原理和左旋右旋
红黑树: 平衡二叉树 1.根节点的左边都是比根节点小的,右边都是比根节点大的 2.不能有两个连续的红色,可以有两个连续的黑色 3.首先插入时默认都是红色 4.当某一个节点为红色,他的父节点和叔叔节点也 ...
- 红黑树理解(五)右旋
红黑树理解 (一) 从2-3树到红黑树 红黑树理解(二)插入过程图解 红黑树理解(三)变色 红黑树理解(四)左旋 红黑树理解(五)右旋 右旋的目的是什么? 将以旋转节点为根的红黑树的根节点左移,配合其 ...
- Java之HashMap经典算法-红黑树(插入节点平衡调整,左旋转,右旋转)
1. 红黑树的优势 有了二叉搜索树,为什么还需要平衡二叉树? 二叉搜索树容易退化成一条链,这时,查找的时间复杂度从 O(log2N)O(log_2N)O(log2N) 将退化成 O(N)O(N )O ...
- 红黑树插入操作的初步理解
红黑树插入操作的初步理解 文章目录 红黑树插入操作的初步理解 红黑树的特征 红黑树的插入节点总是红色的 红黑树的修正 变色 左旋 右旋 插入操作 插入操作的代码实现 红黑树和AVL树的对比 参考链接 ...
- HashMap-红黑树插入平衡、左旋、右旋源码解析
目录 一.树的演变 二.红黑树 1.红黑树的特点 2.树左旋右旋的过程 3.红黑树插入节点情景分析: 三.HashMap插入平衡.左旋.右旋源码解析 1.添加值 2.插入平衡 3.左旋.右旋 一.树的 ...
- 红黑树的原理_红黑树插入算法实现原理分析
引言 红黑树是在实际工程中被广泛应用的一种数据结构,比如Linux中的线程调度就是使用的红黑树来管理进程控制块,而Nginx中也是使用红黑树来管理的timer,Java中的TreeMap和Tree ...
- 红黑二叉树的左旋右旋和变色
小白解析红黑树的基本 什么是红黑树 变色 右旋 什么是右旋呢? 左旋 什么情况下会左旋 什么是红黑树 这就是一个简单的红黑二叉树 红黑二叉树有以下几条基本的规则: 1. 节点分为红色或者黑色. 2.根 ...
最新文章
- Python Qt GUI设计:QTabWidget、QStackedWidget和QDockWidget容器控件类(提升篇—2)
- Windows 2008 R2 Powershell 3.0
- GitLab CI持续集成配置方案
- 【百度】大型网站的HTTPS实践(一)——HTTPS协议和原理
- 如何搞定高并发系统设计?
- Mysql触发器与事务
- 潜在语义分析(TF-IDF、LSA)
- slickedit 运行java_SlickEdit 一些使用技巧(转载)--一个人的博客
- Robotics: Computational Motion Planning(路径规划)笔记(完):人工势场法(Artificial Potential Fields)
- DevExpress控件手册
- macmini更换硬盘重装系统后安装win10双系统
- Python开发资源速查表
- English and Programming_Day1
- switch日版有中文吗_Switch中文系统终于到来!近日将推送更新,美版日版港版均支持...
- export default (imported as router) was not found_开关插座IEC/EN/AS/NZS澳洲SAA认证
- 赛博朋克宣言1993_赛博朋克2077和未来武器
- VScode+Unity3D的配置
- 纯前端实行—简单的用户信息记录界面
- 华为创始人任正非简介
- 19001月1日是星期一c语言,已知道1900年1月1日是星期一,请输入一具体的日期,如何判断此日期是星期几?请利用C语言来进行编程...