前方:全程无码高清,适合各种闲的D痛并有自虐倾向的孩子O(∩_∩)O~
来一段复制黏贴(出处不详),为了之后了解(二)、(三)红黑树的删除和插入做准备:
目录
第一点 常见的树
第二点 左旋、右旋
|
BST(二叉搜索树/二叉排序树) |
AVL(平衡二叉树) |
RBT(红黑树) |
定义 |
1、空树; 2、或者有如下气质的树: 1)任意节点的左子树不为空, 则左子树上所有节点的值均小于该任意节点的值; 2)任意节点的右子树不为空, 则右子树上所有节点的值均大于该任意节点的值; 3)任意节点的左右子树也分别为二叉查找树; 4)没有键值相等的节点。 |
1、空树; 2、或者有如下气质的排序树: 1)左右子树的深度之差的绝对值不超过1 (平衡因子=左子树深度-右子树深度); 2)任意节点的左右子树也分别为平衡二叉树。
|
1、空树; 2、或者有如下气质的树: 1)每个节点要么是黑色要么是红色的; 2)根节点是黑色的; 3)叶子节点(NIL节点、空节点)是黑色的; 4)如果一个节点是红色的,那么它的左右子节点只能是黑色的, 即:一条路径上不可能出现两个相邻的红节点; 5)从任意节点到其每个叶子节点的所有路径上的黑色节点数目都是一样的。 |
性能 |
查找最好时间复杂度O(logN),最坏时间复杂度O(N) 插入删除操作算法简单,时间复杂度与查找差不多
|
查找的时间复杂度维持在O(logN),不会出现最差情况 AVL树在执行每个插入操作时最多需要1次旋转, 其时间复杂度在O(logN)左右 AVL树在执行删除时代价稍大,执行每个删除操作的 时间复杂度需要O(2logN) |
查找 效率最好情况下时间复杂度为O(logN),但在最坏情况下比AVL要差一些,但也远远好于BST。 插入和删除操作改变树的平衡性的概率要远远小于AVL(RBT不是高度平衡的)。 因此需要的旋转操作的可能性要小,而且一旦需要旋转,插入一个结点最多只需要旋转2次, 删除最多只需要旋转3次(小于AVL的删除操作所需要的旋转次数)。虽然变色操作的时间复杂度在O(logN), 但是实际上,这种操作由于简单所需要的代价很小。 |
插入 |
1、如果是空树,则作为根节点; 2、不是空树则从根节点搜索, 1)值小于当前节点,该节点有左孩子,一直找下去, 直到没有左孩子,插入的节点作为左孩子; 2)值大于当前节点,该节点有右孩子,一直找下去, 直到没有右孩子,插入的节点作为右孩子; |
自己去研究吧
|
见:红黑树之插入(三)
|
删除 |
1、如果要删除的节点没有左右孩子,则直接删除; 2、如果要删除的节点有左右孩子, 则找左子树的最大值或者右子树的最小值, 来替换要删除的节点,然后删除需要删除的节点; |
自己去研究吧
|
见:红黑树之删除(二)
|
注1:
平衡二叉树肯定是二叉搜索树,反正不亦然;
平衡二叉树是严格的平衡树,因此在插入、删除节点时,旋转次数要比红黑树多;
红黑树是弱平衡树,用非严格的平衡来换取增删节点需要旋转的次数。
SO:搜索次数远远大于增删次数的,选择平衡二叉树;搜索、增加、删除差不多的,选择红黑树。
为什么需要左旋右旋:
当红黑树在试图插入、删除操作时,会使红黑树变的不平衡(违反红黑树定义的第4)和5)条),为了使插入和删除后的红黑树成为真正的红黑树,就需要通过一定的手段来达到目的。
手段包括:
1、改变着色:黑->红 红->黑
2、左旋
3、右旋
注2:以下几种单支情况在平衡的红黑树中不可能出现。-------出现了这些情况,就需要左右旋+着色咯