数据结构(十一)红黑树

Posted by YaPi on August 25, 2019

2-3树

满足二分搜索树的基本性质,但是它不是一种二叉树,它有两种节点,节点可以存放一个元素或这两个元素,存放一个元素时有左右两个孩子,存在两个元素的节点有三个孩子

2-3树添加节点不会添加到一个null的位置,比如从头开始添加节点,添加c,而后添加b的时候不会成为c的孩子节点。而会成为c的左孩子,当继续添加d的时候还是会添加到b旁边,成为3个节点,然后,从b进行分裂,d,c成为他的子孩子。

avatar

2-3树

            b c
        /    |   \
       a1    a2   a3

a1 < b < a2 < c < a3

2-3树是一颗绝对平衡的树(从根节点到叶子节点经过的节点数量是相同的,左右子树的高度是一致的)

红黑树与2-3树之间的关系

红黑树当中黑色的节点,和2-3树中的2节点相同 红黑树中用一个黑色节点连接一个红色节点来代表一个三节点。所以,一个红色节点表示:它和它的父节点一起表示一个2-3树中的一个三节点,并且红色节点一定是向左倾斜的

avatar

avatar

红黑树定义

  • 依然是二分搜索树
  • 每个节点或者是红色或是黑色
  • 根节点是黑色

    根节点要么是2节点,要么是3节点,不管是2节点还是3节点,它的颜色都是黑色的

  • 每一个叶子节点(不是我们以前认为的叶子,而是最后的空节点)是黑色的
  • 如果一个节点是红色的,那么他的孩子节点都是黑色的

    不管它的子节点是2节点还是3节点,它的根节点都是黑色的

  • 从任意一个节点到叶子节点,经过的黑色节点是一样的

    2-3树是一颗绝对平衡的树,从2-3的任意一个节点到叶子节点所经过的点数是一样的,当从红黑树的任意一个节点到叶子节点时,都会走过相同的黑色节点。一般就说红黑树是保持黑平衡的二叉树(黑色节点保持着绝对平衡)

  • 如果一个节点是黑色节点,如果有有孩子那么他的右孩子一定是黑色的
红黑树三节点添加
红黑树和AVL树的比较

红黑树的高度是 2logN,所以在查询上面的性能会比AVL树性能低一点,但是在红黑树中添加和删除的时候会比AVL树快速一点。所以对于经常发生改变的数据用红黑树,对于创建了就不变了,多用于查询的数据,最好用AVL树存储。

性能总结

对于完全随机的数据,普通的二分搜索树就很好,因为不会退化成链表

对于查询较多的使用情况,AVL树很好用

对红黑树来说,它牺牲了平衡型,它不是一个平衡二叉树,但是它的统计性更优(综合增删查改所有的操作)