红黑树顾名思义是一种以颜色作为节点区分的二叉树,具体来说,是一种三叉链的二叉搜索树,相较于平衡二叉树而言,红黑树的控制节点高度的方式从原来AVL树的高度差超过一就频繁旋转调整的方式更改为根据红黑关系进行调整,这样下来,虽然搜索效率不如AVL树,但考虑到二叉树的结构,影响是微乎其微的,但是红黑树的插入效率会有比较大的提升。
1.红黑树节点非黑即红
2.根节点是黑色的
3.颜色为红的节点,则它的孩子节点是黑色->树中不能出现连续的红色节点:黑+黑/红+黑/黑+红->最短节点全黑,最长节点红黑交替
4.每条路径都包含相同的黑色节点
红黑树的节点具有三叉链的结构,除此之外,一般来说考虑键值对的方式进行数据管理,以及对应的节点需要有颜色的标记,对应的代码如下:
首先我们需要明确的是红黑树每次新增节点颜色应该选择红色节点,考虑前面提到的性质:每条路径上的黑色节点数目相同,那么插入黑色节点会对整条路径产生影响,而插入红色节点只会对自己的父亲产生影响,相比较下来,如果新增节点需要调整,那么调整的范围会小很多。
如果插入节点是红色节点,那么根据性质:路径中不允许出现连续的红色节点,此时父亲的颜色是进行处理的关键根据:
1.新增节点父亲是黑色,那么就插入结束,不需要处理
2.新增节点父亲是红色,需要处理(变色/变色+旋转)
红黑树处理方式关键在于叔叔颜色
情况一属于比较简单的情况,具体操作就是直接将父亲和叔叔变成黑色,然后再将祖父变成红色,再将祖父编程当前节点,继续向上调整,重复以上过程,如果祖父的父亲是黑色就结束,如果是红色就继续。
对应的代码如下:
具体操作就需要旋转+变色,旋转是为了使当前子树的结构变成情况一的结构,再对节点进行变色处理
值得注意的是这里旋转可能需要旋转两次,根据插入节点相对于父亲节点的位置而定。
RBTree.h:
main.c:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。