红黑树与AVL树

1,红黑树(RBT)的定义:它或者是一颗空树,或者是具有一下性质的二叉查找树:

1.节点非红即黑。

2.根节点是黑色。

3.所有NULL结点称为叶子节点,且认为颜色为黑

4.所有红节点的子节点都为黑色。

5.从任一节点到其叶子节点的所有路径上都包含相同数目的黑节点。

《红黑树与AVL树》

2,如何理解和记忆这5个定义?

称为“红黑树”,即节点非红即黑,给节点着色的目的是为了使树保持一定的平衡性质,那么如何来保持一棵树的平衡性质呢?

我们定义从某个节点X出发(不包含该节点)到达一个叶子节点的任意一条简单路径上的黑色节点个数称为该节点的黑高(black-height),记为bh(X)。根据性质5,红黑树的黑高为根节点的黑高。我们假设红黑树的黑高为n,即从根节点到叶子节点共n+1个黑色节点,那么从根节点到叶子节点的最短路径长度为n,即路径上的点全为黑色;又根据性质4,从根节点到叶子节点的最长路径长度为红黑相间的路径,即有n个红色节点,路径长度为2n;

那么我们得出一个结论:红黑树中,根节点到叶子节点的路径长度不超过任何其他路径的两倍个人理解这就是红黑树的平衡性能!

这5个定义也表明,若红黑树高为h,则黑高至少为h/2,即树中内顶点个数n一定大于等于2的h/2幂减1;即h一定小于等于2log(n+1);这也可看出它的平衡性!

可以看到,红黑树并不是平衡二叉树,相反,红黑树放松了AVL树中严格的平衡条件,从而提高了红黑树的一些性能!

3,红黑树与平衡二叉树的异同点?

相同点:都是在进行插入或删除操作时,通过特定的操作维持树的平衡性质,从而获得较高的查找性能!

不同点:

(1),定义不同。

(2),红黑树放弃了平衡二叉树的完全平衡,追求大致平衡,在与平衡二叉树性能相差不大的情况下,保证每次插入或删除最多执行3次旋转就能达到平衡!

(3),而平衡二叉树追求绝对平衡,条件苛刻,每次插入或删除需要执行的旋转操作次数是未知的!

(4),红黑树查找比AVL树稍差,因为AVL树是高度平衡,但插入删除要好,因为旋转次数少!据说红黑树有更好的效率和更高的统计性能!

具体:

《红黑树与AVL树》

4,应用?

简单来说,红黑树是通过降低平衡性能来减少插入或删除时的旋转次数,所以个人理解,若是应用中,搜索次数远远大于插入和删除,则应选择AVL树,若是插入删除多或者与搜索操作差不多,则选择RB树。

但是据说红黑树的统计性能要好于平衡二叉树(AVL树),因此,红黑树在很多地方都有应用。在C++ STL中,很多部分(目前包括set, multiset, map, multimap)应用了红黑树的变体(SGI STL中的红黑树有一些变化,这些修改提供了更好的性能,以及对set操作的支持),还有在linux内核上也有红黑树的应用!

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