本人菜鸡一只,正在更新红黑树系列的文章。

该系列已经全部更完,有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;}}

当然,到现在我们还不知道到底为什么要旋转?

欲知后事如何,且看下回分解!

本人菜鸡一只,如果有笔误或者自己理解的不到位的地方,还请各位看官批评指出,避免写出不严谨,甚至误导新人的文章!!

【算法】红黑树插入数据(变色,左旋、右旋)(二)相关推荐

  1. HashMap 数据结构之红黑树, 红黑树在什么时候左旋 右旋 如何旋转

    树结构是数据结构中最经典最常用的结构之一,也是面试中常问的面试题,最近学习了一下红黑树的知识,记录整理一下 文章目录 一.红黑树的特征 二.变色左旋和右旋 1.变色规则 2.左旋 3.右旋 总结 前言 ...

  2. nyoj202 红黑树 (二叉树的左旋右旋)

    题目202 题目信息 运行结果 本题排行 讨论区 红黑树 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 什么是红黑树呢?顾名思义,跟枣树类似,红黑树是一种叶子是黑色果子 ...

  3. 红黑树的基本原理和左旋右旋

    红黑树: 平衡二叉树 1.根节点的左边都是比根节点小的,右边都是比根节点大的 2.不能有两个连续的红色,可以有两个连续的黑色 3.首先插入时默认都是红色 4.当某一个节点为红色,他的父节点和叔叔节点也 ...

  4. 红黑树理解(五)右旋

    红黑树理解 (一) 从2-3树到红黑树 红黑树理解(二)插入过程图解 红黑树理解(三)变色 红黑树理解(四)左旋 红黑树理解(五)右旋 右旋的目的是什么? 将以旋转节点为根的红黑树的根节点左移,配合其 ...

  5. Java之HashMap经典算法-红黑树(插入节点平衡调整,左旋转,右旋转)

    1. 红黑树的优势 有了二叉搜索树,为什么还需要平衡二叉树? 二叉搜索树容易退化成一条链,这时,查找的时间复杂度从 O(log2N)O(log_2N)O(log2​N) 将退化成 O(N)O(N )O ...

  6. 红黑树插入操作的初步理解

    红黑树插入操作的初步理解 文章目录 红黑树插入操作的初步理解 红黑树的特征 红黑树的插入节点总是红色的 红黑树的修正 变色 左旋 右旋 插入操作 插入操作的代码实现 红黑树和AVL树的对比 参考链接 ...

  7. HashMap-红黑树插入平衡、左旋、右旋源码解析

    目录 一.树的演变 二.红黑树 1.红黑树的特点 2.树左旋右旋的过程 3.红黑树插入节点情景分析: 三.HashMap插入平衡.左旋.右旋源码解析 1.添加值 2.插入平衡 3.左旋.右旋 一.树的 ...

  8. 红黑树的原理_红黑树插入算法实现原理分析

    ­ 引言 红黑树是在实际工程中被广泛应用的一种数据结构,比如Linux中的线程调度就是使用的红黑树来管理进程控制块,而Nginx中也是使用红黑树来管理的timer,Java中的TreeMap和Tree ...

  9. 红黑二叉树的左旋右旋和变色

    小白解析红黑树的基本 什么是红黑树 变色 右旋 什么是右旋呢? 左旋 什么情况下会左旋 什么是红黑树 这就是一个简单的红黑二叉树 红黑二叉树有以下几条基本的规则: 1. 节点分为红色或者黑色. 2.根 ...

最新文章

  1. Python Qt GUI设计:QTabWidget、QStackedWidget和QDockWidget容器控件类(提升篇—2)
  2. Windows 2008 R2 Powershell 3.0
  3. GitLab CI持续集成配置方案
  4. 【百度】大型网站的HTTPS实践(一)——HTTPS协议和原理
  5. 如何搞定高并发系统设计?
  6. Mysql触发器与事务
  7. 潜在语义分析(TF-IDF、LSA)
  8. slickedit 运行java_SlickEdit 一些使用技巧(转载)--一个人的博客
  9. Robotics: Computational Motion Planning(路径规划)笔记(完):人工势场法(Artificial Potential Fields)
  10. DevExpress控件手册
  11. macmini更换硬盘重装系统后安装win10双系统
  12. Python开发资源速查表
  13. English and Programming_Day1
  14. switch日版有中文吗_Switch中文系统终于到来!近日将推送更新,美版日版港版均支持...
  15. export default (imported as router) was not found_开关插座IEC/EN/AS/NZS澳洲SAA认证
  16. 赛博朋克宣言1993_赛博朋克2077和未来武器
  17. VScode+Unity3D的配置
  18. 纯前端实行—简单的用户信息记录界面
  19. 华为创始人任正非简介
  20. 19001月1日是星期一c语言,已知道1900年1月1日是星期一,请输入一具体的日期,如何判断此日期是星期几?请利用C语言来进行编程...

热门文章

  1. selenium安装及配置
  2. 戴尔390计算机电源问题,DELL笔记本电脑电源适配器无电压输出故障
  3. Kaggle数据集-贷款逾期预测
  4. 小米max2装鸿蒙,小米max2全新玩法,连接电视大屏玩游戏看电影!
  5. 初三计算机word 操作题,信息技术中考word操作题.doc
  6. ssm项目笔记(五)图片存储方案
  7. 用HTML5和JavaScript做一个轮播图
  8. 51单片机PCF8591-AD-DA转换
  9. 什么是作用域、作用域链
  10. IDEA 远程断点调试