美文网首页
【数据结构】【C#】031-平衡二叉树(AVL):🌴四种平衡调整

【数据结构】【C#】031-平衡二叉树(AVL):🌴四种平衡调整

作者: lijianfex | 来源:发表于2018-11-18 07:42 被阅读276次

    平衡二叉树的调整

    要保证始终是平衡二叉树,就必然要在 插入 删除操作后对树进行调整,让其的|BF(T) |≤ 1
    所以平衡二叉树的重要操作是调整树

    • RR旋转(右单旋)
    • LL旋转(左单旋)
    • LR旋转(左-右双旋)
    • RL旋转 (右-左双旋)

    以月份按月份缩写的字母顺序为比较标准,构建平衡二叉树的调整

    1、RR旋转(右单旋)


    依次 输入 Mar , May , Nov (3月,5月,11月)
    当在插入 11月时,树的根节点的平衡因子为 -2 ,不满足 构成 平衡二叉树条件|BF(T)| <=1,所以需要进行调整


    针对上述插入引起的不平衡采取RR旋转(右单旋)
    RR旋转(右单旋):不平衡的“发现者”是Mar,“麻烦结点”Nov在发现者右子树的右边, 因而叫 RR 插入,需要RR 旋转(右单旋)

    2、LL旋转(左单旋)


    再向调整后的月份树插入 Aug , Apr (8月,4月)
    两个月份都以 A 字母 开头,则 比较 第二位 的字母 在字母表中的顺序,从而得出大小关系,所以 Apr < Aug;Aug 又小于 Mar ,所以 插入结果如下,同时需要对树进行调整

    针对上述插入引起的不平衡采取LL旋转(左单旋)

    LL旋转(左单旋):“发现者”是Mar,“麻烦结点”Apr在发现者左子树的左边, 因而叫LL 插入,需要LL 旋转(左单旋)

    3、LR旋转(左-右双旋)

    再次加入 Jan (1月)
    插入后,如下图所示,导致 May 的BF = 2 ,需要对树进行调整


    针对上述插入引起的不平衡采取LR旋转(左-右双旋)

    LR旋转(左-右双旋): “发现者”是May,“麻烦结点”Jan在在发现者左子树的右边, 因而叫 LR 插入,需要LR 旋转

    4、RL旋转 (右-左双旋)

    再次顺序插入 Dec , July , Feb (12月,7月,2月)
    导致 Aug 节点的BF = -2 ,需要对树进行调整


    RL旋转(右-左双旋): “发现者”是Aug,“麻烦结点”Dec在发现者右子树的左边, 因而叫 RL 插入,需要RL 旋转

    重新计算 一些平衡因子

    最后插入 June , Oct , Sept (6月,10月,9月)

    注意:有时候插入元素即便 不需要调整结构也可能需要重新计算 一些平衡因子


    C语言代码实现:

    平衡二叉树数据结构:
    插入调整:

    辅助函数:

    相关文章

      网友评论

          本文标题:【数据结构】【C#】031-平衡二叉树(AVL):🌴四种平衡调整

          本文链接:https://www.haomeiwen.com/subject/xxdifqtx.html