| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 【数据结构与算法】【16】红黑树 -> 正文阅读 |
|
[数据结构与算法]【数据结构与算法】【16】红黑树 |
什么是红黑树 红黑树是在AVL树的基础上改进的一种二叉查找树,英文名R-B Tree 上一篇我们已经讲过,AVL树是一种高度平衡的二叉查找树 它的查找效率最高,但是由于要维护平衡性,插入和删除效率便降低了 红黑树则是降低了一点平衡性的要求,从而来提升插入和删除效率 由于在实际场景中,很难有数据只查询不修改的,因此红黑树的适用场景更广,综合效率更高 红黑树的特性 红黑树的节点必须满足以下五个特性
以上规定,最终决定了红黑树的平衡性: 根节点到任意叶节点的最长路径,不多于最短路径的两倍(路径全黑时最短,红黑相间时最长) 可见,红黑树中的节点平衡因子,是可以大于1的 红黑树插入时的平衡性修复 红黑树的平衡修复,主要是通过染色、左旋、右旋三种方式来实现的 在向红黑树插入新节点时,我们一般都将节点染成红色 因为插入红色节点时,只需要处理两个节点连续红色的问题,比较容易修复 如果插入黑色节点,则会出现根节点到叶节点黑色点数量异常的问题,这个比较难修复 红黑树的插入大致可以分为七大类情形,在讲述这七大类情形时,我们先了解一下术语定义
情形一:N为根节点 N染成黑色,直接作为红黑树根节点即可,修复完成 情形二:P为黑色 黑色点数量不变,不影响平衡性,无需任何处理,修复完成 情形三:P为红色,U为红色
情形四:P为红色,U为黑色,P左N左
情形五:P为红色,U为黑色,P右N右
情形六:P为红色,U为黑色,P左N右
情形七:P为红色,U为黑色,P右N左
红黑树删除时的平衡性修复 红黑树的删除比较繁琐,分为很多种情况,每种情况又有很多子类型 整体上,根据节点位置,可以分为四大类情况
下面我们逐个情况来讲解如何进行删除和再平衡 在此之前,我们先要搞清楚,怎么样才算平衡性修复成功 这个判断标准就是:根节点到所有NIL节点的黑色出现次数,和平衡之前相等 我们统一将被删除节点称为D节点,D节点兄弟为B节点,D节点父亲为P节点,B节点孩子分为LN和RN节点 1 D为叶节点 这种情况又分为D为红色,D为黑色两大类情况 1-1 D为红色 直接删除D节点即可
这又分为D在P左侧,以及D在P右侧的情况,我们只讲解D在左侧的情况,另一种情况处理方式是一样的 对于红黑树的任意叶节点,其最下面两层的结构,只可能是以下五种情况 由于D为黑色,且为叶节点,要保持平衡性,则P右侧必有一个黑色节点,且最多两层,只可能是以下五种情况
2 D有左孩子,没有右孩子 LC的值赋给D,删除LC
RC的值赋给D,删除RC
LC的值赋给D,问题转换为递归删除LC
1-2-1
1-2-3 1-2-4 1-2-5 红黑树代码实现 红黑树实现代码的核心是插入和删除后的再平衡 由于红黑树的情景实在是太多了,这里不再逐个实现,一般面试也不会让大家手动去实现红黑树 但是当大家拿到一张红黑树的图时,自己应当知道如何去删除某个节点并进行平衡修复 红黑树特性和应用 普通二叉查找树,查找、插入、删除操作,在最坏情况下复杂度是O(n),最好情况下复杂度是O(logN) 而红黑树则可以保证,在最坏情况下复杂度为O(logN),整体效率比普通二叉查找树高很多 红黑树在Java中的主要应用场景有HashSet和HashMap |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/28 2:35:17- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |