zoukankan      html  css  js  c++  java
  • 平衡二叉树--AVL树

    关键字:AVL、插入、删除
    前言:
      
    平衡二叉树和AVL树这两个概念的区分:平衡二叉树是对这样一种数据结构的定义,是一种描述;而AVL树则是对这样子一种数据结构的实现。同红黑树和B树等一样,都是对这样一种结构的实现,同时都是具有自平衡特性的。

      AVL树是最早的被发明的自平衡二叉树。

    1、定义:
      ①左子树和右子树都是AVL树;
      ②左子树和右子树的高度差不能超过1。
     
    2、性质:
      ①一棵n个结点的AVL树的其高度保持在0(log2(n)),不会超过3/2log2(n+1);
      ②一棵n个结点的AVL树的平均搜索长度保持在0(log2(n));
      ③一棵n个结点的AVL树删除一个结点做平衡化旋转所需要的时间为0(log2(n))。
     
    3、AVL树维持平衡的方式:平衡因子、旋转。
     
    4、AVL树添加新节点:
    (1)找到插入节点的位置,然后插入节点;
    (2)判断此时树中是否有不平衡点。如果没有那就万事大吉。如果有,那么首先确定不平衡起始点,然后按照自平衡的旋转策略(左旋、右旋)进行相应的操作(详见:自平衡方式--旋转)。
     
    5、AVL树删除节点:
    (1)搜索删除节点;
    (2)查找替换节点;
      ①如果删除节点是叶子节点,那么替换节点就是NULL;
      ②如果删除节点有一个子节点,那么替换节点就是其左子节点或者右子节点;(如果删除节点有一个子节点,那么这个子节点肯定是叶子节点,要满足AVL严格平衡的特性。)
      ③如果删除节点有两个孩子,那么中序遍历的后继节点就作为替换节点;
    (3)将替换节点与删除节点交换;(注意:替换时本质上就是交换一下两个节点的值,两个节点原来的位置还是不变的。)
    (4)删除操作:
      ①判断删除此时的替换节点之后,哪个节点会导致不平衡。确定不平衡起始点,然后按照旋转策略(详见:自平衡方式--旋转)进行相应的操作,确保删除当前节点之后树还是平衡的;
      ②经过第一步的调整,保证在删除节点之后树还是平衡的情况下,再删除节点。
     

    AVL树&&红黑树对比:
    ①由于AVL树是要保证严格平衡的,所以对于插入和删除,会比红黑树慢,因为红黑树只是要求相对平衡;
    ②由于AVL树是要保证严格平衡的,所以在一定的情况下,在AVL树中进行查找会比在红黑树中快。

     
     
  • 相关阅读:
    SourceInsight中文字体
    Android Studio导入第三方类库的方法
    Unable to create Debug Bridge:Unable to start adb server:error:cannot parse version
    match_parent 、 fill_parent 、 wrap_content
    android:textAppearance
    AndroidManifest配置之uses-sdk
    从Github上下载了项目,导入Android Studio,gradle 报错,应该怎么修改
    Android Studio 使用Gradle多渠道打包
    Android Studio常用快捷键
    在一个form表单中根据不同按钮实现多个action事件
  • 原文地址:https://www.cnblogs.com/axing-articles/p/11402298.html
Copyright © 2011-2022 走看看