数据结构——红黑树原理

红黑树

  • 性能分析
  • 定义
  • 节点变色旋转
  • 插入节点
  • 小结

性能分析

首先,无论是插入数据还是查找数据,红黑树都是平衡的,查找键值的过程类似于二叉查找树,但是确不会出现树失衡,降低查找效率,其次是在插入键值时,虽然会通过左旋或者右旋来调节树的平衡,但是其限制比较低,所以插入的效率依然比较高。

定义

红黑树中的每个节点需要满足以下五个定义
1.每个节点是红的或者是黑的
2.根节点是黑的
3.每个叶子节点是黑的 —— 这里的叶子节点指的原来叶子节点的左右节点
4.如果一个节点是红的,那么它的两个儿子节点都是黑的
5.对每个节点,从该节点到其子孙节点的所有路径上包含相同数的黑节点
数据结构——红黑树原理_第1张图片
这里的空节点当作叶子节点

节点变色旋转

数据结构——红黑树原理_第2张图片
父节点:待插入的节点是该节点的子节点
叔叔节点: 父节点的兄弟节点

插入节点

红黑树中最为关键的就是节点的插入和删除。首先每个节点最开始都是红色,为了满足红黑树的要求而改变了颜色。 注意插入过程类似于二叉树,但是红黑树还需要调整树结构。

  • 插入根节点
    根据定义要求,根节点为黑色,所以第一个节点需要变色,过程见图
    数据结构——红黑树原理_第3张图片
  • 插入第二个节点
    数据结构——红黑树原理_第4张图片
    最开始为黑色,然后插入到根节点的右侧
    数据结构——红黑树原理_第5张图片
    根据变色分析,由于父节点为黑色,所以不需要变色直接插入就可以了
  • 插入第三个节点
    首先找到新节点的父节点,然后插入左侧或者右侧
    数据结构——红黑树原理_第6张图片
    分析,由于父节点为红色,叔叔节点为空,就需要旋转 + 变色
    旋转
    数据结构——红黑树原理_第7张图片
    分析可以知道这里是将父节点的父节点旋转到父节点的左侧 —— 左旋
    变色
    数据结构——红黑树原理_第8张图片
    由于根节点不能为红色,所以将根节点的颜色变为黑色,然后为了满足,每个节点到其根节路径的黑色节点的个数相同,将节点1变为红色。
  • 插入第四个节点
    数据结构——红黑树原理_第9张图片
    首先找到父节点,因为父节点为红色,叔叔节点为红色,根据变换规则,将叔叔节点和父节点变为黑色,然后祖父节点变为黑色,结果如下
    数据结构——红黑树原理_第10张图片
  • 插入第五个节点
    数据结构——红黑树原理_第11张图片
    走到这里我们大致可以知道,红黑树为什么提高插入的效率,因为红黑树并不是追求极致的平衡,而是局部的平衡(这里是个人的看法),通过红黑节点来调整整个树的结构。这里补充一下,在插入数据时,因为节点颜色的改变,可能会调节多次,就是左旋或者右旋多次。

小结

红黑树的原理大致就是以上这些了,关于具体的代码如何实现,有兴趣的朋友研究一下。
总的来说,红黑树就是一种特殊的二叉树结构,其在插入和获取数据上得到了平衡,效率都非常高,这也是为什么在jdk1.8 中 hashmap 会选择使用红黑树来处理哈希冲突。

你可能感兴趣的:(java,java)