zoukankan      html  css  js  c++  java
  • AVL树总结

    定义:一棵AVL树或者是空树,或者是具有下列性质的二叉搜索树:它的左子树和右子树都是AVL树,且左右子树的高度之差的绝对值不超过1

     

    AVL树失衡旋转总结:

    假如以T为根的子树失衡、定义平衡因子为 H(left) – H(right) = bf (平衡因子,balance factor),T的左子树为L,右子树为R;

    情形1:如果 bf(T) = 2,且bf(L)=1, 执行右旋转,高度减1;

    情形2:如果 bf(T) =2 ,且bf(L)= -1, 执行先左后右旋转,高度减1;

    情形3:如果 bf(T) =2 ,且bf(L)= 0, 执行右旋转,高度不变,完毕; (这种情形只有删除时会遇到)

    情形4:如果bf(T) =-2,且bf(R) =-1, 执行左旋转,高度减1;

    情形5:如果bf(T)=-2, 且bf(R)=1, 执行先右后左旋转,高度减1;

    情形6:如果 bf(T) =-2,且bf(R)= 0,执行左旋转,高度不变,完毕;(这种情形只有删除时会遇到)

    在插入时,高度减1,不用向上递归;删除时需要向上递归

     

    AVL树旋转之插入旋转

    设插入一个节点后,最下层的某棵子树不再平衡,设该子树的根节点为T,则

    如果新插入节点在T的左子树的左子树上,则执行右旋转,情形1;

    如果新插入的节点在T的右子树的右子树上,则执行左旋转,情形4;

    如果新插入的节点在T的左子树的右子树上,则执行先左后右旋转,情形2;

    如果心插入的节点在T的右子树的左子树上,则执行先右后左旋转,情形5;

    插入旋转后不会改变该棵子树的高度,因此不用向上层递归;

     

    如果一个插入操作没有导致失衡,则插入操作可能会也可能不会增加数的高度

    如果一个插入操作导致失衡,则插入前的高度和插入失衡旋转后的高度相等,因此插入旋转不用向上递归

    定理:在插入过程中,由平衡状态到失衡状态,树的高度必然加1;由失衡到平衡状态,树的高度必然减1;

    定理:构建AVL树时,导致高度增加的那次插入操作必然不会导致失衡;导致失衡的那次插入旋转操作,必然使树的高度先加1(插入),在减1(旋转)从而使树的高度不变;

     

    AVL树旋转之删除旋转

    要删除节点为T,父节点为P,子节点为S;

    如果T没有孩子节点,即左右子树为空,直接删除,P指向T的指针设为NULL,,向上更新平衡因子,若有失衡按情形调整

    如果T只有一个孩子S, 将P指向T的指针指向S,向上更新平衡因子,如果失衡按情形调整

    如果T有两个孩子,选择后继节点q(也可以选择前驱),用q替换T,接下来删除q,q的左子树一定为空,右子树可能为空也可能不为,此时将q的父节点指向q的指针指向q的右子树,向上更新平衡因子,如果失衡按情形旋转。

      

    性能分析:设N(h)为高度为h的AVL树的最小节点数目,则N(h)=N(h-1) + N(h-2) +1; N(0)=0, N(1)=1; 类似斐波那契数列; 插入、查找和删除的性能均为log(n)

  • 相关阅读:
    生成器 和 生成器 表达式
    函数的三大器
    02.python网络爬虫第二弹(http和https协议)
    python网络爬虫第三弹(<爬取get请求的页面数据>)
    线程
    网络编程
    分时操作系统 与 多道程序系统
    javascript原型深入解析2--Object和Function,先有鸡先有蛋
    javascript原型深入解析1-prototype 和原型链、js面向对象
    js模块化
  • 原文地址:https://www.cnblogs.com/gaoyanqing/p/4307157.html
Copyright © 2011-2022 走看看