二叉排序树、平衡二叉树和红黑树

二叉排序树(二叉查找树)

二叉排序树或者是一棵空树,或者是具有下列性质:若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值;若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;左、右子树也分别为二叉排序树;没有键值相等的节点。

中序遍历二叉排序树时,可以得到一个有序的序列。

构造一颗二叉排序树的目的,并不是为了排序,而是为了提高查找和插入删除关键字的速度。

因为一棵由n个结点随机构造的二叉查找树的高度为lgn,所以顺理成章,二叉查找树的一般操作的执行时间为O(log n)。但二叉查找树若退化成了一棵具有n个结点的线性链后,则这些操作最坏情况运行时间为O(n)。

因此,二叉排序树是一种好的数据结构,但左右子树可能相差太大,导致其查找效率低,为此想到了使其左右子树的深度相差不要太大,以期提高查找的效率。

平衡二叉树(AVL树)

本身首先是一棵二叉查找树。带有平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1。

最小不平衡树:距离插入结点最近的,且平衡因子的绝对值大于1的结点为根的子树。

平衡二叉树的构建:在构建二叉排序树的过程中,每当插入一个结点,先检查是否破坏了树的平衡性,若是,找出最小的不平衡树,通过右旋(顺时针,BF>0)、左旋(逆时针,BF<0),使之成为新的平衡子树。

查找、插入、删除时间复杂度O(log n)。

平衡二叉树的追求的是全局均衡,如在做插入,删除操作时,需要调整整棵树(旋转树),显然这是费时的,因此希望在做调整时,是局部调整,因此提出了红黑树,这样一种高效的数据结构(也是最变态的一种数据结构)。

红黑树

红黑树,一种二叉查找树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。保证了红黑树的查找、插入、删除的时间复杂度最坏为O(log n)。

但它是如何保证一棵n个结点的红黑树的高度始终保持在logn的呢?这就引出了红黑树的5个性质:

(1)每个结点要么是红的,要么是黑的。
(2)根结点是黑的。
(3)每个叶结点,即空结点(NIL)是黑的。
(4)如果一个结点是红的,那么它的俩个儿子都是黑的。
(5)对每个结点,从该结点到其子孙结点的所有路径上包含相同数目的黑结点。

正是红黑树的这5条性质,使一棵n个结点的红黑树始终保持了logn的高度,从而也就解释了上面所说的“红黑树的查找、插入、删除的时间复杂度最坏为O(log n)”这一结论成立的原因。

《二叉排序树、平衡二叉树和红黑树》

树在经过左旋右旋之后,树的搜索性质保持不变树的红黑性质则被破坏了所以,红黑树插入和删除数据后,需要利用旋转颜色重涂来重新恢复树的红黑性质

红黑树属于平衡二叉树,但他不严格控制左右子树的高度之差的绝对值(平衡因子)最多为1

红黑树和平衡二叉树都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。

红黑树和AVL树的区别在于它使用颜色来标识结点的高度,它所追求的是局部平衡而不是AVL树中的非常严格的平衡。

由于它的设计初衷,任何不平衡都会在三次旋转之内解决(重新达到平衡条件)。这个特点,让他的插入删除操作带来的旋转次数变成了一个常数。提高性能的根源就在这儿了。AVL树是完全平衡的二叉搜索树,就是因为完全平衡这个条件实在太苛刻,无法降低旋转次数,使AVL树变成了一个华而不实的算法。

红黑树能够以O(log2 n)的时间复杂度进行搜索、插入、删除操作。红黑树的算法时间复杂度和AVL相同,但统计性能比AVL树更高。统计指的是对杂乱无章的,完全无序的数据进行排重。

    原文作者:算法小白
    原文地址: https://blog.csdn.net/heyue_99/article/details/74833808
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞