红黑树与平衡二叉树区别?

2023-11-01

如果说平衡二叉树是一个类的话,那么红黑树就是该类的一个实例。
算法的书我丢久了,一下子也找不到,我是凭记忆说的。红黑树的算法比较麻烦,但它的思想很好,如果理解了它的思想也就理解它的算法,我也只记得思想,具体算法记不得了。我就在这说说思想吧。

红黑树有两个重要性质:
1、红节点的孩子节点不能是红节点;
2、从根到前端节点的任意一条路径上的黑节点数目一样多。

这两条性质确保该树的高度为logN,所以是平衡树。

红黑树是每个节点都带颜色的树,节点颜色或是红色或是黑色,红黑树是一种查找树。红黑树有一个重要的性质,从根节点到叶子节点的最长的路径不多于最短的路径的长度的两倍。对于红黑树,插入,删除,查找的复杂度都是O(log N)。


插入的节点总是设为红节点,当其复节点为红节点时,这就有破坏了性质1,就需要调整。将插入节点作为考察节点,考察其叔父,如果也是红节点,则将其父亲和叔父改为黑节点,而将其祖父改为红节点,然后以其祖父为考察节点。如果其叔父是黑节点则做一旋转变换可以搞定,没有图不太好说明,你可以自己考虑一下,总之它的思想是把“多出来”的红色往上一层推去,确保下面层红黑性质,最后推到根以后,如果依然违反性质1,则可以直接把根由红改黑即可,就相当于把这“多出来”的红色推到树以外的节点去了。

删除节点时先要找到顶替的节点,如果删去的节点是黑色则破坏了性质2,也需要调整。调整的思想也同前面类似,把这个黑色赋予顶替节点,则顶替节点相当于有两重黑色,然后将它的两重黑色向上推,一直推到根,再从根推到外面去了。


平衡二叉树的调整算法几乎所有数据结构的书都有呀,根据破坏平衡性的加入点,将插入操作分为了四种,分别是LL、LR、RR、RL。每种引起不平衡的插入位置,均有相应的调整算法。




AVL树又称高度平衡的二叉搜索树,是1962年由两位俄罗斯的数学家G.M.Adel'son-Vel,sky和E.M.Landis提出 的.引入二叉树的目的是为了提高二叉树的搜索的效率,减少树的平均搜索长度.为此,就必须每向二叉树插入 一个结点时调整树的结构,使得二叉树搜索保持平衡,从而可能降低树的高度,减少的平均树的搜索长度. 

AVL树的定义:

 一棵AVL树满足以下的条件: 

1>它的左子树和右子树都是AVL树 

2>左子树和右子树的高度差不能超过1 从条件1可能看出是个递归定义,如GNU一样. 


性质: 

1>一棵n个结点的AVL树的其高度保持在0(log2(n)),不会超过3/2log2(n+1) 

2>一棵n个结点的AVL树的平均搜索长度保持在0(log2(n)). 

3>一棵n个结点的AVL树删除一个结点做平衡化旋转所需要的时间为0(log2(n)).


# 红黑树是一种很有意思的平衡检索树。它的统计性能要好于平衡二叉树(有些书籍根据作者姓名,Adelson- Velskii和Landis,将其称为AVL-树),因此,红黑树在很多地方都有应用。在C++ STL中,很多部分(目前包括 set, multiset, map, multimap)应用了红黑树的变体(SGI STL中的红黑树有一些变化,这些修改提供了更好的性能,以及对set操作的支持)。  
#   
# 红黑树的定义如下:  
#   
#   
# 满足下列条件的二叉搜索树是红黑树  
#   
#     * 每个结点要么是“红色”,要么是“黑色”(后面将说明)  
#     * 所有的叶结点都是空结点,并且是“黑色”的  
#     * 如果一个结点是“红色”的,那么它的两个子结点都是“黑色”的  
#     * (注:也就是說,如果結點是黑色的,那么它的子節點可以是紅色或者是黑色的)。  
#     * 结点到其子孙结点的每条简单路径都包含相同数目的“黑色”结点  
#     * 根结点永远是“黑色”的  



AVL 树是高度平衡的,频繁的插入和删除,会引起频繁的reblance,导致效率下降
红黑树不是高度平衡的,算是一种折中,插入最多两次旋转,删除最多三次旋转

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

红黑树与平衡二叉树区别? 的相关文章

  • 数据结构 ——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现

    一 基本概念 每个结点最多有两棵子树 左子树和右子树 次序不可以颠倒 性质 1 非空二叉树的第n层上至多有2 n 1 个元素 2 深度为h的二叉树至多有2 h 1个结点 满二叉树 所有终端都在同一层次 且非终端结点的度数为2 在满二叉树中若
  • 617. 合并二叉树(c++)

    暴力解 当t1为空返回t2 当t2为空返回t1 当t1 t2都有值 new新节点为两个节点的和 新节点左子树为原始节点左子树合并 新节点右子树为原始节点右子树合并 Definition for a binary tree node stru
  • 输出具有n个结点的所有不同的二叉树-增强前序遍历形式输出-C++

    我们知道具有n个结点的不同的二叉树的数量是个 这是一个卡塔兰数 那么如何确定这些二叉树是什么样子的呢 下面是博主的思路 我们还知道一个入栈序列的不同出栈序列的数量也是个 于是博主就想 这不是巧了么 既然他们的数量是一样的 而且均不相同 那么
  • java实现赫夫曼树以及赫夫曼编码和解码(用byte[])

    首先对于赫夫曼编码有个大概的理解 赫夫曼编码 Huffman Coding 又称霍夫曼编码 是一种编码方式 可变字长编码 VLC 的一种 Huffman于1952年提出一种编码方法 该方法完全依据字符出现概率来构造异字头的平均长度最短的码字
  • C语言二叉树的基本操作(超全)

    二叉树作为数据结构其实是一个挺有意思的结构 可以有多种应用 我们直接来看一下二叉树的代码 include
  • 二叉查找树(BST)的基本概念及常用操作

    二叉查找树 二叉查找树 Binary Search Tree 也称二叉搜索树 有序二叉树 ordered binary tree 排序二叉树 orted binary tree 是指一棵空树或者具有下列性质的二叉树 若任意节点的左子树不空
  • 【数据结构】 二叉树面试题讲解->壹

    文章目录 引言 相同的树 https leetcode cn problems same tree description 题目描述 示例 示例一 示例二 示例三 题目解析 代码实现 另一棵树的子树 https leetcode cn pr
  • LeetCode 108. 将有序数组转换为二叉搜索树Golang版

    LeetCode 108 将有序数组转换为二叉搜索树Golang版 1 问题描述 给你一个整数数组 nums 其中元素已经按 升序 排列 请你将其转换为一棵 高度平衡 二叉搜索树 高度平衡 二叉树是一棵满足 每个节点的左右两个子树的高度差的
  • java判断是否为序列二叉树 - Kaiqisan

    大家好 都吃晚饭了吗 我是Kaiqisan 是一个已经走出社恐的一般生徒 今天还是二叉树诶嘿嘿 首先还是明确一个概念 何为序列二叉树 答 中序遍历之后序列递增的二叉树为序列二叉树 比如这棵树 4 2 7 1 3 5 8 6 它的中序遍历结果
  • [课程复习] 数据结构之线性表、树、图、查找、排序经典算法复习

    作者最近在复习考博 乘此机会分享一些计算机科学与技术 软件工程等相关专业课程考题 一方面分享给考研 考博 找工作的博友 另一方面也是自己今后完成这些课程的复习资料 同时也是在线笔记 基础知识 希望对您有所帮助 不喜勿喷 无知 乐观 低调 谦
  • 二叉树交换左右子树的三种实现方式

    二叉树交换左右子树的三种实现方式 顺序存储结构 链式存储结构 顺序存储结构 交换左右子树实际上就是同层之间交换位置 在顺序存储结构下 先确定树的深度 再划分层 每个层内做交换即可 链式存储结构 递归实现很简单 非递归可以借助栈或队列辅助实现
  • 搞懂后序遍历!只需要这一篇

    讲讲对于后序遍历的理解 并通过题目加深理解 文章目录 核心 基础实现方式 104 二叉树的最大深度 111 二叉树的最小深度 222 完全二叉树的节点个数 110 平衡二叉树 101 对称二叉树 总结 核心 后序遍历的顺序为左右中 在一棵二
  • CH7-查找

    文章目录 1 查找的基本概念 2 线性表的查找 2 1 顺序查找 线性查找 算法2 1 0 类型定义 算法2 1 1 顺序查找 算法2 1 2 改进后的顺序查找 性能分析 2 2 折半查找 二分或对分查找 算法2 2 1 非递归算法 算法2
  • 关于数据结构中的叶节点和二度节点的关系(通俗的理解)。

    简单记录一下自己的一些地方和对于这个问题我的一些见解 有说的不好的地方欢迎指正 这里只给出一种理解 另一种利用公式进行理解的 我就不写了 因为csdn里面太多了 先说结论 叶节点的数目 二度节点 1 首先来看这张图 可以看到这个图大体是包含
  • 二叉树的实现及其遍历(Python)

    树是一种基本的 非线性 数据结构 数据结构树分为 根 枝和叶三个部分 节点Node 是组成树的基本部分 每个节点具有名称或 键值 边Edge 边是组成树的另一个基本部分 根Root 树中唯一一个没有入边的节点 路径Path 由边依次连接在一
  • 二叉树的各种操作函数

    include source h 满与空的问题 计算个数时 判断rear和front的大小1 2 空一个 void InitQueue Queue u u front 0 u rear 0 int sizeQue Queue u int s
  • 增量列是否会使该列上的 B 树索引不平衡?

    我一直在思考两个问题 在互联网上找不到任何关于此的资源 dbms 是如何处理的 或者他们呢 尤其是甲骨文 在提问之前 这里有一个例子 假设我有一个主表 MASTER 和从表 SLAVE 主表有一个 ID 列 它是主键 索引由Oracle创建
  • 非聚集索引在 SQL Server 中的工作原理

    我有一个与数据库理论相关的问题 假设我们有一个包含 3 列的表 PersonID PersonName PersonAge 我们知道 当我们有一个一列的非聚集索引时 SQL Server会按照指定的列对表数据进行排序 并从中构建B 树 当我
  • btree是如何存储在光盘上的?

    我知道如何在内存中实现b树 但不清楚如何在光盘中存储trie 我认为主要有两点区别 内存指针和磁盘地址之间的转换 看这个 插入新的k v项时如何拆分页面 在内存中很容易实现 Thanks 这完全取决于您使用的 DBMS 如果您想知道它是如何
  • btree 实现中的分段错误

    任何人都可以帮助消除这个分段错误 我已经在这个代码上工作了一个星期仍然无法调试它 这段代码是Btree的实现 插入部分工作正常 但删除部分出现分段错误 我无法调试它 有人可以帮忙吗 我已经根据此链接给出了输入 已将字母值转换为 ASCII

随机推荐

  • ClickHouse+DBeaver安装总结(踩坑记录)

    原计划是在win上安装clickhouse 并打算用DBeaver对其进行操作 但后来问题较多 无法解决 使用云服务器安装ClickHouse 主机远程访问的方式代替 记录这个过程存在的问题 使用Docker安装clickhouse 参考链
  • SSM毕业设计分享 病人跟踪治疗信息管理系统(含源码+论文)

    文章目录 1 项目简介 2 实现效果 2 1 界面展示 3 设计方案 3 1 概述 3 2 开发环境 3 3 系统流程 3 4 系统结构设计 4 项目获取 1 项目简介 Hi 各位同学好呀 这里是M学姐 今天向大家分享一个今年 2022 最
  • Jmeter入门基础之线程组(Thread Group)

    大家好 我是Billie 很高兴能和大家一起学习Jmeter 目录 摘要 一 概述 参数配置 1 概述 2 配置参数 三 使用案例 新建线程组 四 补充内容 摘要 本篇文章主要介绍了线程组的参数配置和部分使用方法 提示 以下是本篇文章正文内
  • 使用Java进行操作RabbitMQ

    使用Java操作消息队列 现在我们来看看如何通过Java连接到RabbitMQ服务器并使用消息队列进行消息发送 这里一起讲解 包括Java基础版本和SpringBoot版本 首先我们使用最基本的Java客户端连接方式
  • sprintf函数详解

    函数功能 把格式化的数据写入某个字符串 头文件 stdio h 函数原型 int sprintf char buffer const char format argument 参数列表 buffer char型指针 指向欲写入的字符串地址
  • ArcGIS水文分析实战教程(16) ArcHydro 修正地形

    ArcGIS水文分析实战教程 16 ArcHydro 修正地形 本章导读 前面的十几个章节几乎都是通过使用 DEM 数据进行水利数据的提取 水利数据都是基于地形进行衍生 但现实中一般很难得到非常精确的 DEM 数据 如果 DEM 的精度不能
  • 【Qt】ubuntu下Qt开发环境的搭建

    下载对应版本的Qt开发环境 Qt官网下载地址 https download qt io 国内镜像下载地址 https mirrors cloud tencent com qt 建议用镜像下载速度快 集成安装包在 official relea
  • 数字电路设计之verilog 原语

    verilog原语 http wenku baidu co link url vDFd1mnHZTwOa74o1IhJqwsuY7WZjd4zUnw8BucYYlHNkHuBElH4Gw2Ryr6VH8r0UHiih83TqNW55aSAH
  • 请求的资源不支持 http 方法“GET”(随手笔记)

    C api明明发送post 却说不支持get得方法 原因 解决方案 原因 错误截图 这种情况是由于WebAPI的路由设置不对 才出现访问失败情况 解决方案 只要修改路由配置就好了 请看截图 修改前截图 修改后截图 代码 config Rou
  • spark学习9.1:sparkStreaming接kafka

    1 kafka介绍 kafka可以作为传输的中间件 即生产者和消费者中间的代理商 1 1 kafka中broker 介绍 即kafka中集群的每个服务器 每个服务器就是一个broker 1 2 topic 某类数据的主题 比如 订单数据都丢
  • spring boot配置ssl证书,异常:Invalid keystore format

    环境介绍 springBoot中配置了一个bean bean加载的时候 会进行jks的加载 jks文件放在src resources下 然后就报错了 错误如下 错误提示 Caused by java lang IllegalArgument
  • 可以白嫖的良心在线工具分享

    善于运用工具 可以大大提高我们的工作和生活效率 节省时间 本次将给大家分享一些可以白嫖的良心在线工具网站 1 docsmall 实用压缩工具 docsmall com 安利给经常需要压缩图片 GIF PDF文件的小伙伴 除了我提到的压缩功能
  • 雷石服务器故障维修技术论坛,【图片】维修技术资料分享!!!!(不定期更新)!!!!【汽车维修技术吧】_百度贴吧...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 11 宝来1 8轿车每次启动后都会有游车现象 一辆宝来轿车在每次启动后都会有游车现象 现象为在800转到1300转之间上下浮动 这种现象在大众车里是非常常见的 根据维修经验总结有一下几点 1 是
  • 《LeetCode系列》---合并两个有序数组

    今天的这道leetcode题 将通过逆向双指针来进行解决 涉及知识 数组相关知识的基础 目录 一 题目描述 二 思路分析 1 题目思路 2 代码分析 三 代码提交 一 题目描述 题目名称 合并两个有序数组 编号88 难度 简单 简单来说 该
  • Postman如何实现数据驱动?【软件测试技术】

    要实现Postman的数据驱动 主要分为五个大步骤 第一步 什么是数据驱动 第二步 设计测试用例 第三步 在Postman中编写测试用例脚本 第四步 分析脚本 设计数据文件 并通过参数化关联匹配数据参数 第五步 引用数据文件 执行测试用例
  • 公司测试部门来了个00后卷王,老油条感叹真干不过,不过.....

    在程序员职场上 什么样的人最让人反感呢 是技术不好的人吗 并不是 技术不好的同事 我们可以帮他 是技术太强的人吗 也不是 技术很强的同事 可遇不可求 向他学习还来不及呢 真正让人反感的 是技术平平 却急于表现自己的人 每天加班到12点 在老
  • 如何实现百万并发连接的 Nginx 集群

    要实现百万并发连接的 Nginx 集群 可以考虑以下几种方案 横向扩展 使用多台 Nginx 服务器来处理并发连接 通过将流量分发到多个节点 每个节点处理一部分连接 从而实现并发连接的处理能力扩展 可以使用负载均衡器 如硬件负载均衡器 Ng
  • Anaconda安装教程(超详细)

    Anaconda安装教程 超详细 2022 11 16成功配置写下这篇文章 1 Anaconda的下载 我是在官网下载的 并没有网上说的那么慢 大概5 7分钟左右就下好了 这里附上官网下载地址 Anaconda官网下载地址 进去是这样的 直
  • alibaba/COLA 4.0框架 使用记录

    文章目录 背景 COLA框架 开发情况 出现的问题 总结 建议 背景 简介 开发团队之前没用过DDD开发 第一次用https github com alibaba COLA框架试着做项目 记录一些遇到的问题 https github com
  • 红黑树与平衡二叉树区别?

    如果说平衡二叉树是一个类的话 那么红黑树就是该类的一个实例 算法的书我丢久了 一下子也找不到 我是凭记忆说的 红黑树的算法比较麻烦 但它的思想很好 如果理解了它的思想也就理解它的算法 我也只记得思想 具体算法记不得了 我就在这说说思想吧 红