红黑树(RBTree)原理

文章目录

    • 一、概述
    • 二、特点
    • 三、维护
    • 四、小结

一、概述

红黑树(RBTree)是什么,或者说存在意义是什么呢?我个人认为,红黑树可以说是在一定程度上优化了的平衡二叉树(AVLTree),也可以说是一个不完成的平衡二叉树

本文假设读者已经对AVL树有了较深刻的了解,那咱们就已知AVL树在最坏情况下增删改查的时间均为O(logn),这正是AVL树高效的地方。

但是AVL树在维护上的成本比较大,为了尽量减小成本,便提出了红黑树的理论。

二、特点

红黑树的优势:

  1. AVL树的时间复杂度理论上优于红黑树,但考虑到现在的计算机运算速度,一定程度上可以忽略性能差异;
  2. 红黑树的插入与删除更便于操作;
  3. 由于旋转情况更少,红黑树的整体性能略优于AVL树

红黑树的性质:

  1. 节点的颜色只有红色与黑色;
  2. 根节点一定是黑色;
  3. 红色节点的子节点一定是黑色;
  4. 对于每个节点来说,从该节点到其每个后代叶节点到简单路径上,黑色节点数量相同

由性质可以得出结论:红黑树的最长路径一定不超过最短路径的两倍。

原因:
红色节点的子节点一定为黑色=>红色节点一定不大于黑色节点;
每条路径上的黑色节点数量相同=>红色节点+黑色节点<=2*黑色节点

三、维护

根据上诉可以知道我们最后要得出的红黑树结果应该如何,接下来问题就变成了我们如何维护这棵红黑树。

红黑树的插入可以分为以下步骤:

  1. 无根节点,[插入/删除]黑色根节点;
  2. 有根节点,查找需要[插入/删除]的节点位置;
  3. [插入红色新节点/删除当前节点];
  4. 根据修改节点对树的影响,重新调整为红黑树

为什么一定是插入红色新节点而不是黑色?

从性质上来思考:如果我们插入的是黑色节点会怎么样?
因为性质已经保证了每条路径的黑色节点数量相同,那无论在何处插入黑色节点,都会立刻造成红黑树整体失衡,导致调节成本大幅提高
如果是红色节点,在不影响父节点与子节点不能为红色的这一条件下,就不需要调整树的结构,减少了多种调节情况

四、小结

本文只叙述了红黑树的原理,详细的旋转与变色操作有很多大佬写了就不在此重复。

你可能感兴趣的:(c++,c++)