美文网首页
8.平衡二叉搜索树

8.平衡二叉搜索树

作者: LucXion | 来源:发表于2022-01-14 16:19 被阅读0次

    Balanced Binary Search Tree : BBST

    当节点数量固定时,左右子树的高度越接近,那么这棵二叉树就越平衡(高度越低),保持二叉树的平衡可以避免二叉树退化成链表,防止操作二叉树的复杂度增加。

    常见的平衡二叉搜索树:

    AVL树:Windows NT 内核中广泛使用

    红黑树:C++ STL(比如map 、set),java 的Tree Map 、Tree Set 、HashMap、HashSet,Linux 进程调度,Ngix的timer管理

    一般它们也称为:自平衡的二叉搜索树(Self-balancing Binary Search Tree)

    AVL树

    失衡:每个节点的平衡因子绝对值 ≤ 1

    某节点的平衡因子 = 左子树高度 - 右子树高度

    添加、删除、搜索的复杂度 O(logn)

    添加节点造成的失衡

    LL-右旋转(单旋)平衡

    note(n)、parent(p)、g(grandfather)

    g为失衡节点

    如何找到失衡节点:节点类多维护一个height属性,

    • g.left = p.right

    • p.right = g

    • 同时维护 T2、g、p 的 parent 属性

    RR-左旋转(单旋)

    LR-RR左旋转,LL右旋转(双旋)

    RL-LL右旋转,RR左旋转(双旋)

    image-20220113143328884.png
    伪代码:
    // Note添加高度属性height
    // 1.成功添加完节点的操作后,延着节点的父节点链条遍历父节点
    // 2.父节点对应子节点高度+1,接着对比左右子节点高度,如果没有失衡,更新高度,失衡->做对应的旋转,节点高度不变
    示例:13,14,15,12,11,17,16,8,9,1
    

    删除节点造成的失衡

    绿色代表着T2的最大高度,会影响旋转后的子树的整体高度,如果子树高度发生变化,需要向上检查是否失衡

    要在删除操作结束后,才去平衡树

    LL右旋转

    RR右旋转

    LR-RR左旋转,LL右旋转

    RL-LL右旋转,RR左旋转

    相关文章

      网友评论

          本文标题:8.平衡二叉搜索树

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