7.3.3_1红黑树的定义和性质

知识总览:

为什么要发明红黑树:

二叉排序树BST

红黑树RBT的查找、插入和删除效率基本和AVL平衡二叉树的相同,但是平衡二叉树在插入和删除节点操作时容易被破坏平衡,所以需要消耗大量时间重新调整树的形态(主要时间用在计算平衡因子,找最小不平衡树等),而红黑树在插入和删除操作时就不需要频繁调整树的形态,即便需要调整,一般也可在常数级完成,所以红黑树很牛

一般查询多,插入删除少的用平衡二叉树,如果是插入、删除多的用红黑树

j 

红黑树定义:

红黑树是二叉排序树的一种优化,则红黑树有二叉排序树BST的特性,即节点值左子树<根节点<右子树(左<中<右) ,每个节点上除了有左子孩子指针外,还有节点的颜色color

定义:

1.红黑树的节点的颜色要么是黑色要么是红色

2.红黑树中的叶节点一般指的是查找失败的节点,叶节点又叫NULL空节点或者外部节点,注意不是最下层的节点,二叉排序树中的查找失败的节点也是NULL节点即不存在的节点,根节点和叶节点一定都是黑色的节点

4.红黑树中的父子节点不能出现连续的红节点,但是如果是兄弟节点可以是连续的红节点,如下图3,节点17是红节点,则它的父节点13和孩子节点15和25必须都是黑节点,否则就出现连续的红节点了,如果15节点是红节点,则不满足红黑树定义,22和27是兄弟节点可以是连续红节点

5.从任一节点(包括根节点)出发,该节点到任一叶节点的有各种各样的路径,但是不管是啥路径,在各个路径上所经过的黑节点的个数是相同的。如下从13出发可以到达各个叶节点,13->8->1->null,13->8->11->null,13->17->15->null等等路径,所经过的黑节点个数都是2(注意从某个节点出发所经过的黑节点数量不包括出发节点,即便是从该节点出发该节点是黑节点,那也不包括),以上路径所经过的黑节点依次是(1,null)、(11,null)、(15,null)即都是2个黑节点

红黑树口诀:

左根右======》指的是满足节点值左子树<根节点<右子树

根叶黑======》指的是根节点和叶子节点都是黑节点

不红红======》指的是父子节点不存在2个相邻的红节点

黑路同======》指的是一条路走到黑,走到叶子节点(叶子节点是黑的),所包含的黑节点数目相同

平衡二叉树AVL也是二叉排序树的一种优化,AVL每个节点上除了有左右孩子指针外,还有平衡因子

练习:

如下截图中分别违反不红红(父子节点2个红节点不能相邻)和根叶黑要求(根节点是黑色的)、黑路同(从1节点出发到叶子黑节点,经过的黑节点数目分别为1和2),即不符合红黑树要求

 

补充概念:节点的黑高

黑高bh定义: 从某一节点出发(不包含该节点)到达任一空叶节点的路径上的黑节点的数目(跟上边的红黑树的黑路同特性类似)

如下15节点的bh=2,即15->11->8->null(黑节点为11和NULL节点)或者15->18->null(黑节点为18和和NULL节点)等等在到达叶节点上的路径上的黑节点的数目都是2,根节点6bh=2同,6->2->null(黑节点为2、NULL节点)或者6->15->18->20->null(黑节点为18、NULL节点)等等路径的黑节点的数目=2

 红黑树的性质:

1.从根节点到叶节点的最长路径不大于最短路径的2倍(这个是因为不允许2个红节点相邻出现,所以最长路劲肯定是红黑交叉的路径,所以最长路径不大于最短路径的2倍。。。。可能是吧。。)

2.有n个内部节点的红黑树高度h<=2log2(n+1),即红黑树的查找效率为log2n数量级,即红黑树的查找时间复杂度为O(log2n)

红黑树的查找:因为红黑树也是二叉排序树,所以查找和二叉排序树一样,从根节点出发,左小右大,若找到空叶节点则查找失败

知识回顾:

 

又水一篇。。。。。。。。。。。。。 

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

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

相关文章

微处理器原理与应用篇---冯诺依曼体系结构

冯诺依曼体系结构&#xff1a;计算机的基础设计范式 一、冯诺依曼体系结构的起源与定义 提出背景&#xff1a; 1945 年&#xff0c;匈牙利数学家约翰・冯・诺依曼&#xff08;John von Neumann&#xff09;在《EDVAC 报告书的第一份草案》中提出该架构&#xff0c;为现代计算…

vue3 + TypeScript +Element Plus 输入框回车事件 @keydown.enter

在 Vue 3 TypeScript Element Plus 的环境下&#xff0c;keyup.enter.native 和 keydown.enter 在 el-input 组件上的区别主要在于 事件触发时机 和 Vue 3 的事件处理机制。以下是详细对比&#xff1a; 1. keydown.enter&#xff08;推荐&#xff09; 触发时机&#xff1a;当…

android gradle的优化

在setting.gradle.kts配置 google()maven("https://maven.aliyun.com/repository/google")// 官方 Maven Central&#xff0c;最通用mavenCentral()// 特殊仓库&#xff08;4thline&#xff0c;Cling 用&#xff09;maven {url uri("http://4thline.org/m2&q…

jmeter工具简单认识

2025最新Jmeter接口测试从入门到精通&#xff08;全套项目实战教程&#xff09; 一、JMeter 介绍 Apache JMeter是100%纯JAVA桌面应用程序&#xff0c;被设计为用于测试客户端/服务端结构的软件(例如web应用程序)。它可以用来测试静态和动态资源的性能&#xff0c;例如&#xf…

Rail 分析的实现思路(python)(1)

本文适用于 Rail 0.1 版本. 工作:输入Rial文件的路径,识别词元,输出实例列表. 是一边写代码一边写文章的,所以有时候改了原本的代码不一定会说.以思路为中心. Rail是一种信息分布与细节构成的表示语言。详见参考文档. 关于本文的分析对象&#xff0c;参考逻辑行的类型. 从源文…

【JAVA】数组的使用

文章目录 前言一、数组的基本概念1.1 数组的创建和初始化1.2 数组的基本使用 二、数组是引用类型2.1 初始JVM的内存分布JVM内存划分&#xff08;按功能分区&#xff09; 2.2 基本类型变量与引用类型变量的区别2.3 再谈引用变量2.4 认识null 三、数组作为函数的参数和返回值四、…

Python图像处理与计算机视觉:OpenCV实战指南

引言 在当今数字化时代&#xff0c;图像处理和计算机视觉技术已经渗透到我们生活的方方面面&#xff0c;从智能手机的人脸识别解锁&#xff0c;到自动驾驶汽车的路况感知&#xff0c;再到医疗影像辅助诊断系统。作为这一领域最流行的开源库之一&#xff0c;OpenCV (Open Sourc…

OCCT基础类库介绍:Modeling Algorithm - Features

Features 特征 This library contained in BRepFeat package is necessary for creation and manipulation of form and mechanical features that go beyond the classical boundary representation of shapes. In that sense, BRepFeat is an extension of BRepBuilderAPI …

【前端AI实践】DeepSeek:开源大模型的使用让开发过程不再抓头发

有时候你可能正对着屏幕发呆&#xff0c;不知道怎么下手一个 Vue 的流式请求功能。这时候&#xff0c;DeepSeek 就像是你的“编程外挂”&#xff0c;帮你把模糊的需求变成清晰的代码。 下面我们就以几个常见的开发场景为例&#xff0c;看看 DeepSeek 能帮我们做点啥。 解答技…

SAP S/4HANA 的“Smart Core”:在现实与理想之间实现敏捷扩展

摘要&#xff1a; 在 SAP S/4HANA 的实施过程中&#xff0c;“Clean Core”&#xff08;干净核心&#xff09;已成为热门话题&#xff0c;指的是通过简化和优化系统架构&#xff0c;减少技术债务、提升性能并增强可升级性。尽管这是 SAP 推动云转型的核心理念之一&#xff0c;…

Python 量化金融与算法交易实战指南

https://www.python.org/static/community_logos/python-logo-master-v3-TM.png 金融数据获取与处理 使用yfinance获取市场数据 python 复制 下载 import yfinance as yf import pandas as pd# 下载苹果公司股票数据 aapl yf.Ticker("AAPL") hist aapl.histo…

【StarRocks系列】join查询优化

目录 Join 类型 和 Join 策略 1. Join 类型&#xff08;Join Type&#xff09; 2. Join 策略&#xff08;Join Strategy&#xff09; 分布式 Join 策略 (核心) 1. Colocate Join (本地 Join - 最优): 2. Bucket Shuffle Join: 3. Broadcast Join (复制广播): 4. Shuffl…

【论文解读】ZeroSearch: 零API成本激活大模型Web搜索

1st author: Hao Sun 孙浩 - PhD Candidate Peking University - Homepage paper: [2505.04588] ZeroSearch: Incentivize the Search Capability of LLMs without Searching code: Alibaba-NLP/ZeroSearch: ZeroSearch: Incentivize the Search Capability of LLMs without…

JAVA网络编程中HTTP客户端(HttpURLConnection、Apache HttpClient)

HTTP 客户端是 Java 中实现网络请求的核心工具,主要用于与 Web 服务器交互(如获取网页、提交表单、调用 REST API 等)。Java 生态中有两种主流的 HTTP 客户端实现:​​HttpURLConnection(JDK 原生)​​ 和 ​​Apache HttpClient(第三方库)​​。以下是两者的详细解析、…

C# Process.Start多个参数传递及各个参数之间的空格处理

最近做一个软件集成的事情&#xff0c;有多个之前做的软件&#xff0c;集成到一起自己用&#xff0c;使用了 Process.Start&#xff08;“*.exe”&#xff09;的方式&#xff0c;然而遇到了传递参数的问题。 这里汇总后的程序叫main.exe&#xff0c;要汇总的软件之一是pro1.…

【Python】Excel表格操作:ISBN转条形码

一、效果 原始文件&#xff1a; 输出文件&#xff1a; 二、代码 import os import logging from openpyxl import load_workbook from openpyxl.drawing.image import Image as ExcelImage from barcode import EAN13 from barcode.writer import ImageWriterlogging.basicCo…

【Fargo】mediasoup发送2:码率分配、传输基类设计及WebRtcTransport原理

Fargo 使用了mediasoup的代码,搬运了他的架构架构精妙,但是似乎是为了sfu而生,【Fargo】mediasoup发送1:控制与数据分离的分层设计和原理我本地用来发送测试,因此需要进一步梳理: 通过分析这段代码,我来详细解释: 一、sfu 需要码率级别的分配控制 1. DistributeAvail…

矩阵置零C++

给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 思路&#xff1a; 1、让首行首列记录哪一行哪一列有0 2、于是可以直接遍历非首行首列的元素&#xff0c;若该元素对应的首行首列为0&#xff0c;说明…

大内存对电脑性能有哪些提升

在科技飞速发展的今天&#xff0c;电脑已经成为我们生活和工作中不可或缺的伙伴。无论是日常办公、追剧娱乐&#xff0c;还是进行复杂的游戏和专业设计&#xff0c;电脑的性能都至关重要。而在影响电脑性能的众多因素中&#xff0c;内存大小常常被人们忽视。 多任务处理更流畅…

【StarRocks系列】Update语句

目录 简要流程 详细流程 1. UPDATE 语句执行流程 2. 如何更新表的数据 3. 是否支持事务 总结关键点 简要流程 前端处理&#xff08;FE&#xff09;&#xff1a; 解析 SQL 并验证主键条件生成包含主键列表和新值的更新计划按主键哈希分发到对应 BE 后端执行&#xff08…