数据结构和算法-红黑树(定义 性质 查找 插入 删除)

文章目录

红黑树的定义和性质

为什么要发明红黑树?

插入和删除即一般不会破坏特性,并且即使破坏,恢复的代价比较低

红黑树怎么考

总览

红黑树的定义

叶节点不是我们认为的没有子树的节点了,是空节点,即我们所认识的叶子节点的孩子就是叶节点

实例:一颗红黑树

练习:是否符合红黑树的要求


将6变为红后

但此时7不满足二叉排序树,替换为11即可

一种可能的出题思路

补充概念:节点黑高

注意不包括出发的节点

红黑树的性质

由于根节点到任意节点的的路径上所含黑节点的数目相同,最短就是全黑嘛,但最长就是有红节点在路径上,由于不存在相邻的红节点这个特性,所以节点树最多的情况就是在黑节点之间有红节点,此时总结点数模至多为全黑节点的两倍

红黑树的查找

和查找平衡二叉树和二叉排序树一样,小于走左子树,大于走右子树

红黑树的插入

实例

非根节点的插入只需关注不红红的这个问题

插入非根节点为红是为了保持黑路同

插入5后发现有红红,此时叔节点为黑,相对爷节点是LL型,此时父节点右旋换爷节点同时变色

插入后红红,此时叔为红,此时叔父爷变色,爷看作新节点,,此时爷节点是根但为红色再变色

此时再插入一个,存在红红,此时叔为黑,且为RR,此时父换爷,同时父和爷变色

此时加入节点,存在红红,且叔为红,此时叔父爷变色,同时将爷看作新加入的节点,发现没破坏红黑树的特性

插入3没啥大问题

插入2,此时红红,同样父换爷,同时染色

此时红叔,叔父爷变色,同时爷看作新节点

插入35

插入25

插入18

插入22

红红,叔为红,叔父爷变色,此时将爷看作新节点,此时存在红红,而该新节点叔为红,所以此时叔父爷都变色,此时的爷看作新节点,但为红节点,所以变黑

插入23,此时红红,叔为黑,且为LR,此时左旋再右旋,最后变色

左旋结果

右旋结果

最后将原来的儿爷节点变色

插入24

红红,此时叔父爷变色,爷看作新节点,存在红红

此时叔为黑,为LR

先左旋

再右旋

原本的儿爷变色

插入19

插入18

此时已经存在18,可以放18的左边也可以放右边

若插入右边

先右旋

再左旋

原本儿爷变色

小结

由根节点到叶节点的最长路径不大于最短路径的两倍可知道左右子树的高度也不过两倍关系

与黑高相关的理论

外部节点就是空节点

根节点黑高为h的红黑树,此时内部节点要最少的话,必须即全黑即可,因为有红的话不能有相邻的。而此时全黑的情况下也是吗,满树,不然达不到从根节点的黑高为h

黑高大于等于h/2是由于如果是一个黑一红那么黑高将大于等于h/2,又由根节点黑高可得出内部节点数最少数量,最后可得出总高度的范围

红黑树的删除

删除方式和二叉排序树一样

只是调整方式不同

相关推荐
柃歌17 分钟前
【LeetCode Solutions】LeetCode 136 ~ 140 题解
数据结构·算法·leetcode
杰瑞学AI44 分钟前
LeetCode详解之如何一步步优化到最佳解法:21. 合并两个有序链表
数据结构·python·算法·leetcode·链表·面试·职场和发展
石去皿1 小时前
力扣hot100 71-80记录
算法·leetcode·职场和发展
佚明zj1 小时前
[ISP] raw图常见的噪声种类以及生成原因
算法
无 证明1 小时前
【C++】类和对象 (第一弹)
开发语言·c++·算法
xianduan_1 小时前
leetcode刷题记录44-208. 实现 Trie (前缀树)
算法·leetcode·翻译
梭七y1 小时前
【力扣hot100题】(051)腐烂的橘子
算法·leetcode·职场和发展
WG_172 小时前
图的储存+图的遍历
数据结构·算法
C-DHEnry2 小时前
SPFA+SPFA优化+优先队列(汽车加油行驶问题_铺垫aa、汽车加油行驶问题qiche、EasySSSPsssp)
算法·汽车
疾跑哥布林升级版3 小时前
C++---day7
开发语言·c++·算法