红黑树分析

红黑树的性质:

性质1:每个节点要么是黑色,要么是红色。

  • 性质2:根节点是黑色。
  • 性质3:每个叶子节点(NIL)是黑色。
  • 性质4:每个红色节点的两个子节点一定都是黑色。不能有两个红色节点相连。
  • 性质5:任意一节点到每个叶子节点的路径都包含数量相同的黑结点。俗称:黑高!
  • 从性质5又可以推出:性质5.1:如果一个节点存在黑子节点,那么该结点肯定有两个子节点

总结:
根节点必黑,新增是红色,只能黑连黑,不能红连红

红黑树的操作:

红黑树能自平衡,它靠的三种操作:左旋、右旋和变色。
1.变色:结点的颜色由红变黑或由黑变红。
2.左旋:以某个结点作为支点(旋转结点),其右子结点变为旋转结点的父结点,右子结点的左子结点变为旋转结点的右子结点,左子结点保持不变。

在这里插入图片描述

3.右旋:以某个结点作为支点(旋转结点),其左子结点变为旋转结点的父结点,左子结点的右子结点变为旋转结点的左子结点,右子结点保持不变
在这里插入图片描述

红黑树插入节点情景分析

在这里插入图片描述

情景1:红黑树为空树
最简单的一种情景,直接把插入结点作为根结点就行
注意:根据红黑树性质2:根节点是黑色。还需要把插入结点设为黑色。

情景2:插入结点的Key已存在
处理:更新当前节点的值,为插入节点的值

情景3:插入结点的父结点为黑结点
由于插入的结点是红色的,当插入结点的黑色时,并不会影响红黑树的平衡,直接插入即可,无需做自平衡。

情景4:插入节点的父节点为红色
再次回想下红黑树的性质2:根结点是黑色。如果插入节点的父结点为红结点,那么该父结点不可能为根结点,所以插入结点总是存在祖父结点。
这一点很关键,因为后续的旋转操作肯定需要祖父结点的参与

插入情景4.1:叔叔结点存在并且为红结点
依据红黑树性质4可知,红色节点不能相连 ==> 祖父结点肯定为黑结点;
因为不可以同时存在两个相连的红结点。那么此时该插入子树的红黑层数的情况是:黑红红。显然最简单的处理方式是把其改为:红黑红
处理:
1.将P和U节点改为黑色
2.将PP改为红色
3.将PP设置为当前节点,进行后续处理

插入情景4.2:叔叔结点不存在或为黑结点,并且插入结点的父亲结点是祖父结点的左子结点
注意:单纯从插入前来看,叔叔节点非红即空(NIL节点),否则的话破坏了红黑树性质5,此路径会比其它路径多一个黑色节点。

插入情景4.2.1:新插入节点,为其父节点的左子节点(LL红色情况)
处理:
1.变颜色:将P设置为黑色,将PP设置为红色
2.对PP节点进行右旋

插入情景4.2.2:新插入节点,为其父节点的右子节点(LR红色情况)
处理:
1.对P进行左旋
2.将P设置为当前节点,得到LL红色情况
3.按照LL红色情况处理(1.变颜色 2.右旋PP)

插入情景4.3:叔叔结点不存在或为黑结点,并且插入结点的父亲结点是祖父结点的右子结点
处理:
1.变颜色:将P设置为黑色,将PP设置为红色
2.对PP节点进行左旋

插入情景4.3.2:新插入节点,为其父节点的左子节点(RL红色情况)
处理:
1.对P进行右旋
2.将P设置为当前节点,得到RR红色情况
3.按照RR红色情况处理(1.变颜色 2.左旋PP)

总结

爸叔通红就变色,爸红叔黑就旋转,哪边黑往哪边转。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/391738.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

overlay 如何实现跨主机通信?- 每天5分钟玩转 Docker 容器技术(52)

上一节我们在 host1 中运行了容器 bbox1,今天将详细讨论 overlay 网络跨主机通信的原理。 在 host2 中运行容器 bbox2: bbox2 IP 为 10.0.0.3,可以直接 ping bbox1: 可见 overlay 网络中的容器可以直接通信,同时 docke…

第 132 章 Example

这里介绍一个负载均衡放置问题,我们可以把它摆放在任何位置,每种方案都各有优缺点,需要根据你的实际情况选择使用 适用于HAProxy / Nginx / LVS 等等 这里用web,db为例子,讲述负载均衡之间的关系 132.1. 双负载均衡的用法 User --…

Python:实现图片裁剪的两种方式——Pillow和OpenCV

原文:https://blog.csdn.net/hfutdog/article/details/82351549 在这篇文章里我们聊一下Python实现图片裁剪的两种方式,一种利用了Pillow,还有一种利用了OpenCV。两种方式都需要简单的几行代码,这可能也就是现在Python那么流行的原…

第一个应在JavaScript数组的最后

by Thomas Barrasso由Thomas Barrasso 第一个应在JavaScript数组的最后 (The first shall be last with JavaScript arrays) So the last shall be [0], and the first [length — 1].所以最后一个应该是[0] ,第一个[length_1]。 – Adapted from Matthew 20:16–根…

鼠标移动到ul图片会摆动_我们可以从摆动时序分析中学到的三件事

鼠标移动到ul图片会摆动An opportunity for a new kind of analysis of Major League Baseball data may be upon us soon. Here’s how we can prepare.不久之后,我们将有机会对美国职棒大联盟数据进行新的分析。 这是我们准备的方法。 It is tempting to think t…

leetcode 1052. 爱生气的书店老板(滑动窗口)

今天,书店老板有一家店打算试营业 customers.length 分钟。每分钟都有一些顾客(customers[i])会进入书店,所有这些顾客都会在那一分钟结束后离开。 在某些时候,书店老板会生气。 如果书店老板在第 i 分钟生气&#xf…

回到网易后开源APM技术选型与实战

篇幅一:APM基础篇\\1、什么是APM?\\APM,全称:Application Performance Management ,目前市面的系统基本都是参考Google的Dapper(大规模分布式系统的跟踪系统)来做的,翻译传送门《google的Dappe…

持续集成持续部署持续交付_如何开始进行持续集成

持续集成持续部署持续交付Everything you need to know to get started with continuous integration: branching strategies, tests automation, tools and best practices.开始进行持续集成所需的一切:分支策略,测试自动化,工具和最佳实践。…

51nod 1073约瑟夫环

思路传送门 &#xff1a;http://blog.csdn.net/kk303/article/details/9629329 n里面挑选m个 可以递推从n-1里面挑m个 然后n-1里面的x 可以转换成 n里面的x 的公式 x &#xff08;xm&#xff09;%n; #include <bits/stdc.h> using namespace std;int main () {int n,m;s…

如何选择优化算法遗传算法_用遗传算法优化垃圾收集策略

如何选择优化算法遗传算法Genetic Algorithms are a family of optimisation techniques that loosely resemble evolutionary processes in nature. It may be a crude analogy, but if you squint your eyes, Darwin’s Natural Selection does roughly resemble an optimisa…

robot:截图关键字

参考&#xff1a; https://www.cnblogs.com/hong-fithing/p/9656221.html--python https://blog.csdn.net/weixin_43156282/article/details/87350309--robot https://blog.csdn.net/xiongzaiabc/article/details/82912280--截图指定区域 转载于:https://www.cnblogs.com/gcgc/…

leetcode 832. 翻转图像

给定一个二进制矩阵 A&#xff0c;我们想先水平翻转图像&#xff0c;然后反转图像并返回结果。 水平翻转图片就是将图片的每一行都进行翻转&#xff0c;即逆序。例如&#xff0c;水平翻转 [1, 1, 0] 的结果是 [0, 1, 1]。 反转图片的意思是图片中的 0 全部被 1 替换&#xff…

SVN服务备份操作步骤

SVN服务备份操作步骤1、准备源服务器和目标服务器源服务器&#xff1a;192.168.1.250目标服务器&#xff1a;192.168.1.251 root/rootroot 2、对目标服务器&#xff08;251&#xff09;装SVN服务器&#xff0c; 脚本如下&#xff1a;yum install subversion 3、创建一个新的仓库…

SpringCloud入门(一)

1. 系统架构演变概述 #mermaid-svg-F8dvnEDl6rEgSP97 .label{font-family:trebuchet ms, verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-F8dvnEDl6rEgSP97 .label text{fill:#333}#mermaid-svg-F8dvnEDl6rEgSP97 .node rect,#merm…

PullToRefreshListView中嵌套ViewPager滑动冲突的解决

PullToRefreshListView中嵌套ViewPager滑动冲突的解决 最近恰好遇到PullToRefreshListView中需要嵌套ViewPager的情况,ViewPager 作为头部添加到ListView中&#xff0c;发先ViewPager在滑动过程中流畅性太差几乎很难左右滑动。在网上也看了很多大神的介绍&#xff0c;看了ViewP…

神经网络 卷积神经网络_如何愚弄神经网络?

神经网络 卷积神经网络Imagine you’re in the year 2050 and you’re on your way to work in a self-driving car (probably). Suddenly, you realize your car is cruising at 100KMPH on a busy road after passing through a cross lane and you don’t know why.想象一下…

数据特征分析-分布分析

分布分析用于研究数据的分布特征&#xff0c;常用分析方法&#xff1a; 1、极差 2、频率分布 3、分组组距及组数 df pd.DataFrame({编码:[001,002,003,004,005,006,007,008,009,010,011,012,013,014,015],\小区:[A村,B村,C村,D村,E村,A村,B村,C村,D村,E村,A村,B村,C村,D村,E村…

开发工具总结(2)之全面总结Android Studio2.X的填坑指南

前言&#xff1a;好多 Android 开发者都在说Android Studio太坑了&#xff0c;老是出错&#xff0c;导致开发进度变慢&#xff0c;出错了又不知道怎么办&#xff0c;网上去查各种解决方案五花八门&#xff0c;有些可以解决问题&#xff0c;有些就是转来转去的写的很粗糙&#x…

无聊的一天_一人互联网公司背后的无聊技术

无聊的一天Listen Notes is a podcast search engine and database. The technology behind Listen Notes is actually very very boring. No AI, no deep learning, no blockchain. “Any man who must say I am using AI is not using True AI” :)Listen Notes是一个播客搜索…

如何在Pandas中使用Excel文件

From what I have seen so far, CSV seems to be the most popular format to store data among data scientists. And that’s understandable, it gets the job done and it’s a quite simple format; in Python, even without any library, one can build a simple CSV par…