zoukankan      html  css  js  c++  java
  • DataStructuresAndAlogorithm--红黑树

    简介

    为了理解红黑树(red-black tree)是什么,首先需要知道二叉树。

     定义1:二叉树是结点的有限集合,该集合或者为空集,或者是由一个根和两棵互不相交的,称为该根的左子树和右子树的二叉树组成。 

    但是为了解决实际问题,往往需要对数据作一定的排序,这样才能更快速的找到所要的数据。基于此,我们需要了解下二叉搜索树(Binary Search Tree, BST)。

    定义2:设结点由关键字值表征,假定所有结点的关键字值各不相同,二叉搜索树或者谁一棵空二叉树,或者是具有下列性质的二叉树:
        1)若左子树不空,则左子树上所有结点的关键字值均小于根结点的关键字值
        2)若右子树不空,则右子树上所有结点的关键字值均大于根结点的关键字值
        3)左,右子树也分别是二叉搜索树

    然而,某些极端情况下,二叉搜索树可能会变成只有左子树或只有右子树等这些极端情况,相当于树退化成了一个链表,为了防止这种退化,我们需要了解些二叉平衡树。

    定义3:二叉平衡树又成AVL树(G.M.Adel'son-Vel'skii和E.M.Landis),它或者是一棵空二叉树,或者是具有下列性质的二叉树:
        1)其根的左,右子树高度之差的绝对值不超过1
        2)其根的左,右子树都是二叉平衡树

    然而,这还不是非常完美,因为二叉平衡树的性质1导致了其为了维护其平衡性,需要作过多的旋转调整操作,基于此,红黑树这个弱化的二叉平衡树横空出世。

    红黑树在每个结点上增加了一个存储位来表示结点的颜色,可以是RED或BLACK。通过对任何一条根到叶子的简单路径上各个结点的颜色进行约束,红黑树确保没有一条路径会比其他路径长出2倍,因为是近似平衡的。红黑树可以保证在最坏情况下基本动态集合操作的时间复杂度为O(logn)。

    一棵红黑树是满足下面红黑性质的二叉搜索树:

    1)每个结点的或是红色的,或是黑色的
    2)根结点是黑色的
    3)每个叶结点(NIL)是黑色的
    4)如果一个结点是红色的,则它的两个子结点都是黑色的
    5)对每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点
  • 相关阅读:
    [1] Report Fusioncharts
    [1] Entity Framework / Code First
    [1] Ninject
    [1] 插件架构(PLUG-IN)
    linux下为目录和文件设置权限
    解决Class 'swoole_server' not found
    Linux下 PHP 安装pecl_http方法
    php安装swoole扩展
    将PHP 5.3.3 (cli)升级到PHP 5.6.31 (cli)
    windows下composer安装
  • 原文地址:https://www.cnblogs.com/microcat/p/10810424.html
Copyright © 2011-2022 走看看