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树中进行查找会比在红黑树中快。

     
     
  • 相关阅读:
    递归的形式过程
    c/c++程序员常见面试题分析(转)
    深入理解递归函数的调用过程(转)
    C语言union关键字
    中国象棋(java)
    求树中最低的公共祖先
    什么是Complement(补码)?
    LoadRunner,各协议之间的区别
    淘宝模板制作[店铺装修]学习过程+心得
    Tips of QTP
  • 原文地址:https://www.cnblogs.com/axing-articles/p/11402298.html
Copyright © 2011-2022 走看看