红黑树 回顾

Posted allen-rg

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了红黑树 回顾相关的知识,希望对你有一定的参考价值。

一、首先是二叉树:

1)定义

2)前、中、后序遍历

 

二、二叉搜索树:

中序遍历是有序的

本身的定义也是递归的:

1)查找:复杂度 log2n (n表示数的节点个数)

极端情况,退化成链表,查找效率和链表一样

2)插入节点、删除节点也要会

 

 

三、平衡二叉树:左右子树都是平衡二叉树

1)2-3树

2)AVL树

3)红黑树

都是平衡二叉树

 

四、AVL树:平衡因子 {-1,0,1} 

树的每一个节点,左子树和右子树的高度差都属于平衡因子中的一个值,即: -1,0,1

1)左子树高度减去右子树高度的差的绝对值小于等于1

2)通过四种操作来保持平衡

4种旋转操作:(旋转过程中树还是满足二叉搜索树的性质)

左旋:右右子树

              A                                                          B

                    B            -------左旋             A                  C

                           C

右旋:左左子树

               A                                                         B

        B                       -------右旋            A                  C

C

 

左右旋:左右子树

               A                                                        A                                                     C

         B                       ------先左旋            C                -------再右旋                B           A

              C                                            B

 

右左旋:右左子树

          A                                                      A                                                         C

                B               -------先右旋                C         -------- 再左旋             B           A

          C                                                               B

 

带子树的旋转情况,类似,但有可能要更换父节点;

左左、右右、左右、右左四种情况的旋转方式。

3、AVL树总结:
1)平衡的二叉搜索树

2)每个节点存放了平衡因子:-1,0,1

3)四种旋转操作

不足:节点需要存储额外信息、且调整次数频繁(消耗资源)

 

五、近似平衡二叉树(红黑树)

红黑树:近似平衡的二叉树,确保任何一个节点的左右子树的高度差小于两倍

优点:旋转频次低,维护成本低

满足如下条件的二叉搜索树是红黑树:

1)每个节点要么红色要么黑色

2)根节点是黑色

3)每个叶子节点是空节点,是黑色

4)不能有两个邻接的节点是红色

5)任何一个节点到每个叶子的所有路径都包含相同个数的黑色节点

 

时间复杂度:近似 log2n

调整频次也减小了很多

 

旋转:情况复杂,之前看过STL解析,回顾下即可

 

 

六:AVL树和红黑树的对比:

1、AVL树查找比红黑树快,是因为AVL树的严格平衡的

2、红黑树插入和删除要比AVL树效率高是因为,红黑树是近似平衡的二叉树,旋转频率更低

3、红黑树比AVL树需要的存储空间更低,因为AVL树需要一个二外的整数来存储平衡因子或者高度来计算,然而红黑树每个节点只需要一bit额外的信息,来标示红色还是黑色节点

4、红和树被广泛应用于C++的数据结构中,比如map、multiset、multimap中,而AVL树被用在数据库中,为了更快的查询效率

 

所以:

查询操作特别多,那么用AVL树

查询和插入操作差不多的话,用红黑树


以上是关于红黑树 回顾的主要内容,如果未能解决你的问题,请参考以下文章

红黑树

红黑树之删除节点

红黑树

HashMap底层红黑树原理(超详细图解)+手写红黑树代码

红黑树删除详解

红黑树——以无厚入有间(插入)