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

    1、二叉搜索树

    (1)二叉查找树

    左子树不为空的话,左子树的所有结点都小于它的根结点的值,右子树不为空的话,右子树的所有结点都大于它的根结点

    查找的值比当前结点值大,则搜索右子树,反之,搜索左子树

    插入的时候也要从根节点开始比较,直到左子树为空或右子树为空

    中序遍历元素的大小是有顺序的(从小到大)

    删除的时候分为没有子结点的结点、有一个子结点的结点、有两个子结点的结点,

    (2)二叉搜索树时间复杂度

    数据源必须是有序数组,一次迭代查询可以清除掉一半的元素

    (3)缺陷

    强制依赖有序数组,才能保证性能

    最大的缺陷是二叉搜索树退化为链表:效率低,达不到排除一半元素的效果

    2、AVL树

    (1)特点

    具有二分查找树的所有特性

    每一个结点的左子树与右子树的高度差至多等于1

    保证不会出现大量的结点偏向于一边的情况(插入或删除的时候,左旋与右旋操作,使得树再次左右保持平衡)

    虽然平衡树解决了二叉查找树退化为近似链表的缺点,能够把查找时间控制在O(logn),不过却不是最佳的, 因为平衡树要求每个节点的左子树和右子树的高度差至多等于1,这个要求实在是太严,导致每次进行插入删除节点的时候, 几乎都会破坏平衡树的第二个规则,进而我们都需要通过左旋和右旋来进行调整,使之再次成为一棵符合要求的平衡树 显然,如果在那种插入、删除很频繁的场景中,平衡树需要频繁着进行调整,这会使平衡树的性能大打折扣,为了解决这个问题,于是有了红黑树! ! !

    3、红黑树

    (1)定义

    红黑树是一种含有红黑结点并能够自平衡的二叉查找树(左结点的小于父结点,右节点大于父结点),本质是为了解决二叉搜索树的平衡问题

    二叉查找树是一棵非平衡的树:在下面的例子中二叉树退化成了链表结构

    (2)性质

    每一个结点要么是黑色要么是红色

    根结点、叶子结点(NIL)是黑色

    每个红色结点的两个子结点一定是黑色(不能有两个红色结点)

    任意一个结点到每一个叶子结点的路径都包含相同的黑色结点

    4、红黑树的自平衡性

    红黑树的自平衡包括:变色和旋转(左旋与右旋,顺时针为右旋),旋转要有圆心,有方向,旋转结点围绕子结点旋转(子结点为圆心)

    (1)左旋

     (2)右旋

     (3)查找

     从P开始查找,大于P的话向左查找,在与G比较... ...

    (4)增加

    三个点之间的关系:

    CPG(当前、父、祖父)三点一线:

     CPG三角:

     三个点要么是三角关系要么是三点一线关系。

    增加:

    • 空树:新增的结点就是父结点

    • 父结点为黑色

    • 父结点为红色,叔叔结点为红色

    • 父结点为红色,叔叔结点为黑色或空

  • 相关阅读:
    Java 基本语法之--循环
    java 基本语法之--选择结构
    java基本语法之--进制、运算符
    Java的基本语法之--关键字、标识符、变量
    编写第一个 Java 应用程序
    idea安装、配置及基本使用
    jmeter监听器扩展
    jmeter5.1分布式压测
    青花瓷安装
    python 时间和日期
  • 原文地址:https://www.cnblogs.com/zhai1997/p/13455952.html
Copyright © 2011-2022 走看看