目录一、红黑树简介1、红黑树的简介2、红黑树的性质二、红黑树的插入(看叔叔的颜色就行)1、为什么新插入的节点必须给红色?2、插入红色节点后,判定红黑树性质是否被破坏2.1情况一:uncle存在且为红2.2情况二:uncle不存在/存在且为黑(直线)2.3情况三:uncle不存在/存在且为黑(折线)2.4总结3、红黑树插入代码三、红黑树的平衡检测四、红黑树整体代码一、红黑树简介1、红黑树的简介红黑树和AVL树一样,因其逻辑复杂,面试时现场要求手撕就是纯纯刁难面试者。但某大厂面试官曾要求某些求职者现场手撕红黑树(我赌5毛,让面试官撕,他也撕不出来,而且你家员工上班手搓红黑树啊?),随后求职遭遇被发
目录一、红黑树简介1、红黑树的简介2、红黑树的性质二、红黑树的插入(看叔叔的颜色就行)1、为什么新插入的节点必须给红色?2、插入红色节点后,判定红黑树性质是否被破坏2.1情况一:uncle存在且为红2.2情况二:uncle不存在/存在且为黑(直线)2.3情况三:uncle不存在/存在且为黑(折线)2.4总结3、红黑树插入代码三、红黑树的平衡检测四、红黑树整体代码一、红黑树简介1、红黑树的简介红黑树和AVL树一样,因其逻辑复杂,面试时现场要求手撕就是纯纯刁难面试者。但某大厂面试官曾要求某些求职者现场手撕红黑树(我赌5毛,让面试官撕,他也撕不出来,而且你家员工上班手搓红黑树啊?),随后求职遭遇被发
红黑树红黑树的概念红黑树的性质红黑树节点的定义红黑树结构红黑树的插入操作红黑树的验证红黑树与AVL树的比较红黑树的概念红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。通过任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。红黑树的性质每个结点不是红色就是黑色根节点是黑色的如果一个节点是红色的,则它的两个孩子结点是黑色的对于每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点每个叶子结点都是黑色的(此处的叶子结点指的是空结点)思考:为什么满足上面的性质,红黑树就能保证
红黑树红黑树的概念红黑树的性质红黑树节点的定义红黑树结构红黑树的插入操作红黑树的验证红黑树与AVL树的比较红黑树的概念红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。通过任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。红黑树的性质每个结点不是红色就是黑色根节点是黑色的如果一个节点是红色的,则它的两个孩子结点是黑色的对于每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点每个叶子结点都是黑色的(此处的叶子结点指的是空结点)思考:为什么满足上面的性质,红黑树就能保证
目录一、set/map的底层结构1、set/map的源码2、利用模板区分set/map3、利用仿函数控制比较大小二、set/map的迭代器(红黑树的迭代器)1、红黑树的begin、end迭代器2、红黑树迭代器的operator++3、红黑树迭代器的operator--三、set的const迭代器四、map的const迭代器五、迭代器类的拷贝构造六、整体代码1、RBTree.h2、Set.h3、map.h本文相关往期内容,可按需查阅:1、【C++】set/multiset、map/multimap的使用2、【数据结构】二叉搜索树的实现3、【数据结构】平衡二叉树4、【数据结构】手撕红黑树本文难点:
目录一、set/map的底层结构1、set/map的源码2、利用模板区分set/map3、利用仿函数控制比较大小二、set/map的迭代器(红黑树的迭代器)1、红黑树的begin、end迭代器2、红黑树迭代器的operator++3、红黑树迭代器的operator--三、set的const迭代器四、map的const迭代器五、迭代器类的拷贝构造六、整体代码1、RBTree.h2、Set.h3、map.h本文相关往期内容,可按需查阅:1、【C++】set/multiset、map/multimap的使用2、【数据结构】二叉搜索树的实现3、【数据结构】平衡二叉树4、【数据结构】手撕红黑树本文难点:
目录一、引言二、HashMap源码中红黑树插入节点的调整过程三、阅读HashMap源码的一些Tips1.代码风格2.变量名balanceInsertion方法中的变量名rotateLeft、rotateRight方法中的变量名一、引言如果有对红黑树的定义及调整过程有过研究,其实很容易理解HashMap中的红黑树插入节点的调整过程。“红黑树定义及调整过程”的参考文章:《红黑树原理、查找效率、插入及变化规则分析》下面的流程图就是HashMap源码中,红黑树插入节点的调整过程。这个过程要是写文章讲的话,感觉也没什么意思,其实关键还是需要你要清楚红黑树的定义及调整过程,然后知道数据结构里二叉树左旋、右
目录一、引言二、HashMap源码中红黑树插入节点的调整过程三、阅读HashMap源码的一些Tips1.代码风格2.变量名balanceInsertion方法中的变量名rotateLeft、rotateRight方法中的变量名一、引言如果有对红黑树的定义及调整过程有过研究,其实很容易理解HashMap中的红黑树插入节点的调整过程。“红黑树定义及调整过程”的参考文章:《红黑树原理、查找效率、插入及变化规则分析》下面的流程图就是HashMap源码中,红黑树插入节点的调整过程。这个过程要是写文章讲的话,感觉也没什么意思,其实关键还是需要你要清楚红黑树的定义及调整过程,然后知道数据结构里二叉树左旋、右
zset底层的数据结构为什么使用调表而不是红黑树前言Redis中使用到的数据结构以及各个数据对象的底层数据结构在上一篇文章已经写得非常详细,这里不再赘述。https://www.cnblogs.com/ruigedada/p/16248689.htmlzset的底层数据结构是压缩列表和跳表,当满足以下条件时,Redis将使用压缩列表存储有序集合保存的元素个数要小于128个;有序集合保存的所有元素成员的长度都必须小于64字节。我们都知道,调表的查找时间复杂度为O(logn),但是红黑树和AVL树的查找效率也是O(logn)呀,为什么zset的底层是调表而不是红黑树或者AVL树呢?一、跳表、红黑树
zset底层的数据结构为什么使用调表而不是红黑树前言Redis中使用到的数据结构以及各个数据对象的底层数据结构在上一篇文章已经写得非常详细,这里不再赘述。https://www.cnblogs.com/ruigedada/p/16248689.htmlzset的底层数据结构是压缩列表和跳表,当满足以下条件时,Redis将使用压缩列表存储有序集合保存的元素个数要小于128个;有序集合保存的所有元素成员的长度都必须小于64字节。我们都知道,调表的查找时间复杂度为O(logn),但是红黑树和AVL树的查找效率也是O(logn)呀,为什么zset的底层是调表而不是红黑树或者AVL树呢?一、跳表、红黑树