为什么要使用红黑树
  二叉查找树正常情况下时间复杂度是O(log(n)),但是在特殊情况下(如:顺序插入)他会退化成链表,这时候查询、插入和删除一个元素的时候,时间复杂度变成了O(n)。
  平衡二叉查找树可以解决二叉查找树在特殊情况下退化为链表的行为,但是,由于平衡二叉树严格的定义,导致每一次进行查询、插入和删除一个元素的时候,都要去维护二叉树整体的平衡,这就加大了时间和性能上的开销。
  因此,为了查询、插入和删除一个元素所消耗的时间和性能都能达到我们期望的水平,我们需要引入红黑树树。

红黑树
  定义:红黑树是一种含有红黑结点并能自平衡的二叉查找树。
  所具有的性质:
     性质1:每个节点要么是黑色,要么是红色。
     性质2:根节点是黑色。
     性质3:每个叶子节点(NIL)是黑色。
     性质4:每个红色结点的两个子结点一定都是黑色。
     性质5:任意一结点到每个叶子结点的路径都包含数量相同的黑结点。
  红黑树插入:
     插入的节点必须默认是红色,因为插入黑点会增加某条路径上黑结点的数目,从而导致整棵树黑高度的不平衡。但如果新结点的父结点为红色时,将会违反红黑树的性质:一条路径上不能出现相邻的两个红色结点。这时就需要通过一系列操作(左旋,右旋,变色)来使红黑树保持平衡。
     变色:
        1、当插入节点和其父节点都为红色时(因为插入节点默认为红色,因此只需判断其父节点是否为红色即可)我们需要对其进行变色处理:将插入节点的父节点,和其叔叔节点都变为黑色,并且把爷爷节点变为红色,然后旋转。
        2、当叔叔节点不存在或为黑色节点,并且插入节点的父亲节点是祖父节点的左子节点时,父亲节点变为黑色,祖父节点变为红色,并右旋。(若相反则左旋)
     左旋:x为中心,其父节点为a,左边兄弟节点为b,左子节点为c,右子节点为d左旋就是保证x和右子节点d不变,逆时针旋转与x节点的直接相关的左边节点,也就是a,b,c左旋的过程是将x的父节点a,左边兄弟节点b 逆时针旋转,原来的x左节点c被x的父节点替代,原来x的左子节点c逆时针方向平移后变成x的原父节点a的右子节点。
     右旋:以x为中心,其父节点为a,右边兄弟节点为b,左子节点为d,右子节点为c右旋就是保证x和左子节点d不变,顺时针旋转与x直接相关的右边节点,也就是a,b,c右旋的过程是将x的父节点a,右边兄弟节点b,还有右子节点c顺时针旋转。原来的x右节点c被x的父节点替代,原来的x的右子节点c顺时针方向平移后变成x的原父节点a的左子节点。