红黑树的原理

红黑树简介

红黑树是一种自平衡的二叉查找树,是一种高效的查找树。二叉查找树在插入的元素值是递增的的情况下会退化成链表,这样查找的时间复杂度效率就还是O(n),所以为了在构建一个相对平衡的二叉查找树,就有了红黑树。

红黑树具有良好的效率,它可在 O(logN) 时间内完成查找、增加、删除等操作。因此,红黑树在业界应用很广泛,比如 Java 中的 TreeMap,JDK 1.8 中的 HashMap、C++ STL 中的 map 均是基于红黑树结构实现的。

红黑树的性质

  1. 每个结点不是红色就是黑色
  2. 不可能有连在一起的红色结点
  3. 根节点一定是黑色root
  4. 每个红色结点的两个子节点都是黑色。叶子结点都是黑色;出度为0满足了性质就可以近似的平衡了

红黑树的三中变换

  1. 改变颜色。简单来说就是黑变红、红变黑。
  2. 左旋
  3. 右旋

红黑树的变换规则

旋转和颜色变换规则:所有插入的节点默认都是红色的

  1. 变颜色的情况:当前结点的父节点是红色,且它父亲节点的兄弟结点也是红色。
    (1)把父节点和叔叔节点都设为黑色。
    (2)把祖父节点设为红色。
    在这里插入图片描述
    (3)把指针定义到爷爷节点然后再进行分析点变换规则。如果还是满足当前结点的父节点是红色,且它父亲节点的兄弟结点也是红色。再进行上述的变色即可,若不满住就要进行树的旋转。

  2. 左旋:当前父节点是红色,叔节点是黑色,且当前结点是父节点的右子树时那么就要进行以父节点进行左旋操作

  3. 右旋:与左旋不同的唯一条件是当前结点处于左子树时,就进行右旋。

那么回到刚变了色的图
在这里插入图片描述
左旋就是根据当前结点的父节点作为旋转点,替换父节点的位置将父节点作为自己的左子树,并且将自己原来的左子树变为父节点的右子树。旋转后就变成如下树了
在这里插入图片描述
变换后明显发现5和12结点依然是两个红色的节点靠在一起所以不满足红黑树的性质,再进行变换,先变色检查当前结点的父节点是红色,且它父亲节点的兄弟结点也是红色,如果满足就直接将父节点和叔节点变黑,再将爷节点变红即可,但如果爷节点为根节点就不用变色。

很明显上图不满足,上图的父节点为红色,叔节点为黑色,且自己为左子树那么就要进行右旋了。

右旋肯定不是和左旋一样以父节点为节点进行旋转的,否者就会发生左旋右旋循环了。

右旋是先将父节点变为黑色,然后以爷节点作为点进行向右旋转的。
所以上图先将12节点变为黑色再以19节点进行右旋。
在这里插入图片描述

最后看到的结果满足红黑的所有性质,这就是一个完整的红黑树的插入节点过程。

==============================

实现代码待更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值