⭐7.3.2 平衡二叉树
合集·数据结构(精美动画演示讲解) —— 平衡二叉树(AVL树) —— 蓝不过海呀
一秒学会 平衡二叉树的调整,非标题党!不简单你打我! (考研数据结构)—— 公台所言极是
左旋(逆时针旋转)
以(失衡)结点4的右子树根结点7为支点,将(失衡)结点4左旋(逆时针旋转)。
如果该支点7有左孩子,则将其变为旋转结点4的右孩子。
以(失衡)结点5的右子树根结点9为支点,将(失衡)结点5左旋(逆时针旋转)。
如果该支点9有左孩子6,则将其变为旋转结点5的右孩子。
右旋(顺时针旋转)
以(失衡)结点10的左子树根结点7为支点,将(失衡)结点10右旋(顺时针旋转)。
如果该支点7有右孩子,则将其变为旋转结点10的左孩子。
以(失衡)结点14的左子树根结点6为支点,将(失衡)结点14右旋(顺时针旋转)。
如果该支点6有右孩子9,则将其9变为旋转结点14的左孩子。
旋转操作
LL型失衡及平衡操作(分两种情况)
(1)失衡原因:由于在 结点A-31 左子树根结点B-25的左子树BL(原来为空)上插入结点BL-16,结点A-31 的平衡因子由 1 增至 2, 致使以 结点A-31 为根的子树失去平衡。
平衡操作:需对 失衡结点A-31 进行一次右旋(顺时针旋转)操作。
以失衡结点A-31 的左子树根结点B-25 为支点,将失衡结点A-31 右旋(顺时针旋转)。
如果该支点B-25 有右孩子,则将其变为旋转结点A-31 的左孩子。
【如果该支点B-25 有左孩子BL-16,则其BL-16 仍为该支点B-25 的左孩子。如下图的情况。】
(2)失衡原因:由于在结点14左子树根结点6的左子树5上插入结点3,结点14的平衡因子由 1 增至 2, 致使以 结点14 为根的子树失去平衡。
平衡操作:需对 失衡结点14 进行一次右旋(顺时针旋转)操作。
以失衡结点14的左子树根结点6为支点,将失衡结点14右旋(顺时针旋转)。
如果该支点6有右孩子9,则将其9变为旋转结点14的左孩子。
【 不分类时,凡是满足失衡结点平衡因子为2,失衡结点左孩子的平衡因子为1的 都属于LL型。
平衡操作 还是需对 失衡结点 进行一次右旋(顺时针旋转)操作。 】
RR型失衡及平衡操作(分两种情况)
(1)失衡原因:
由于在结点31 的右子树根结点47 的**右子树(原来为空)**上插入结点69,结点31的平衡因子由-1 变为-2,致使以 结点31 为根结点的子树失去平衡。
平衡操作:需对 失衡结点31 进行一次左旋(逆时针旋转)。
以失衡结点31 的右子树根结点47 为支点,将失衡结点31 左旋(逆时针旋转)。
如果该支点47 有左孩子,则将其变为旋转结点31 的右孩子。
【如果该支点47 有右孩子69 ,则其69 仍为该支点47 的右孩子。如下图的情况。】
(2)失衡原因:由于在结点5的右子树根结点9的右子树14上插入结点17,结点5的平衡因子由-1 变为-2,致使以 结点5 为根结点的子树失去平衡。
平衡操作:需对 结点5 进行一次左旋(逆时针旋转)。
以失衡结点5的右子树根结点9为支点,将失衡结点5左旋(逆时针旋转)。
如果该支点9有左孩子6,则将其6变为旋转结点5的右孩子。
【 不分类时,凡是满足失衡结点平衡因子为-2,失衡结点右孩子的平衡因子为-1的 都属于RR型。
平衡操作 还是需对 失衡结点 进行一次左旋(逆时针旋转)。 】
LR型失衡及平衡操作(分三种情况)
(1)LR(0)型
失衡原因:由于在 结点31 的左子树根结点25 的**右子树(原来为空)**上插入结点28, 结点31 的平衡因子由1增至2, 致使以 结点31 为根结点的子树失去平衡。
平衡操作:需进行两次旋转操作。第一次对失衡结点31的左子树25 进行左旋(逆时针旋转),第二次对失衡结点31 进行一次右旋(顺时针旋转)操作,即可恢复平衡。
①先对失衡结点的左子树(平衡因子为-1,并不是失衡结点)进行左旋:
在图中第二棵树,以失衡结点31左子树25 的右子树根结点28为支点,将失衡结点31的左子树25 左旋(逆时针旋转)。
如果该支点28有左孩子,则将其变为旋转结点25的右孩子。
【旋转后,下图第二棵树中结点31不变(与结点25的连线断开),结点25成为根结点28的左子树。根结点28成为结点31的左子树。以结点31 为根结点的子树仍然是不平衡的。(如红色第三棵树)】
②右旋失衡结点本身
以失衡结点31 的左子树根结点28 为支点,将失衡结点31右旋(顺时针旋转)。
如果该支点28有右孩子,则将其变为旋转结点31的左孩子。
【旋转后即为下图第四棵树。】
【区别 LL型失衡的第一种情况 】
(2)LR(L)型
失衡原因:由于在 结点9 的左子树根结点5的右子树8的**左子树(原来为空)**上插入结点6, 结点9 的平衡因子由1增至2, 致使以 结点9 为根结点的子树失去平衡。
平衡操作:需进行两次旋转操作。第一次对失衡结点9的左子树5 进行左旋(逆时针旋转),第二次对失衡结点9 进行一次右旋(顺时针旋转)操作,即可恢复平衡。
①先对失衡结点的左子树(平衡因子为-1,并不是失衡结点)进行左旋:
以失衡结点9左子树5的右子树根结点8为支点,将失衡结点9的左子树5 左旋(逆时针旋转)。
如果该支点8有左孩子6,则将其6变为旋转结点5的右孩子。【前两张图】
②右旋失衡结点本身
以失衡结点9的左子树根结点8为支点,将失衡结点9右旋(顺时针旋转)。
如果该支点8有右孩子,则将其变为旋转结点9的左孩子。【后两张图】
(3)LR(R)型
失衡原因:由于在 结点31 的左子树根结点25的右子树28的**右子树(原来为空)**上插入结点30, 结点31 的平衡因子由1增至2, 致使以 结点31 为根结点的子树失去平衡。
平衡操作:需进行两次旋转操作。第一次对失衡结点31的左子树25 进行左旋(逆时针旋转),第二次对失衡结点31 进行一次右旋(顺时针旋转)操作,即可恢复平衡。
①先对失衡结点的左子树(平衡因子为-1,并不是失衡结点)进行左旋:
在图中第二棵树,以失衡结点31左子树25 的右子树根结点28为支点,将失衡结点31的左子树25 (连带其左子树16)左旋(逆时针旋转)。
如果该支点28有左孩子,则将其变为旋转结点25的右孩子。
【旋转后,下图第二棵树中结点31不变(与结点25的连线断开),结点25成为根结点28的左子树。根结点28成为结点31的左子树。以结点31 为根结点的子树仍然是不平衡的。(如红色第三棵树)】
②右旋失衡结点本身
以失衡结点31 的左子树根结点28 为支点,将失衡结点31(连带其右子树47)右旋(顺时针旋转)。
如果该支点28有右孩子30,则将30其变为旋转结点31的左孩子。
【旋转后即为下图第四棵树。】
【 不分类时,凡是满足失衡结点平衡因子为2,失衡结点左孩子的平衡因子为-1的 都属于LR型。
平衡操作 还是需进行两次旋转。第一次对失衡结点的左子树 进行左旋(逆时针旋转),第二次对失衡结点进行一次右旋(顺时针旋转)操作,即可恢复平衡。 】
RL型失衡及平衡操作(分三种情况)
(1)RL(0)
失衡原因:由于在 结点31 的右子树根结点47 的**左子树(原来为空)**上插入结点40,结点31 的平衡因子由-1 变为-2,致使以 结点31 为根结点的子树失去平衡。
平衡操作:需进行两次旋转操作。第一次对失衡结点31 的右子树47 进行右旋(顺时针旋转),第二次对失衡结点31 进行一次左旋(逆时针旋转)操作,即可恢复平衡。
①先对失衡结点的右子树(平衡因子为1,并不是失衡结点)进行右旋:
以失衡结点31 右子树47 的左子树根结点40 为支点,将失衡结点31 的右子树47 右旋(顺时针旋转)。
如果该支点40 有右孩子,则将其变为旋转结点47的左孩子。【旋转过后的图没画】
②左旋失衡结点本身
以失衡结点31的右子树根结点40为支点,将失衡结点31左旋(逆时针旋转)。
如果该支点40有左孩子,则将其变为旋转结点31的右孩子。
【区别 RR型失衡的第一种情况 】
(2)RL(L)
失衡原因:由于在 结点31 的右子树根结点47 的左子树40 的**左子树(原来为空)**上插入结点36,结点31 的平衡因子由-1 变为-2,致使以 结点31 为根结点的子树失去平衡。
平衡操作:需进行两次旋转操作。第一次对失衡结点31 的右子树47 进行右旋(顺时针旋转),第二次对失衡结点31 进行一次左旋(逆时针旋转)操作,即可恢复平衡。
① 先对失衡结点的右子树(平衡因子为1,并不是失衡结点)进行右旋:
以失衡结点31右子树47的左子树根结点40为支点,将失衡结点31的右子树47(连带其右子树69) 右旋(顺时针旋转)。
如果该支点40有右孩子,则将其变为旋转结点47的左孩子。【旋转过后的图没画】
② 左旋失衡结点本身
以失衡结点31的右子树根结点40为支点,将失衡结点31(连带其左子树25)左旋(逆时针旋转)。
如果该支点40有左孩子36,则将其36变为旋转结点31的右孩子。
(3)RL(R)
失衡原因:由于在 结点5 的右子树根结点9的左子树6的**右子树(原来为空)**上插入结点8,结点5 的平衡因子由-1 变为-2,致使以 结点5 为根结点的子树失去平衡。
平衡操作:需进行两次旋转操作。第一次对失衡结点5的右子树9 进行右旋(顺时针旋转),第二次对失衡结点5 进行一次左旋(逆时针旋转)操作,即可恢复平衡。
① 先对失衡结点的右子树(平衡因子为1,并不是失衡结点)进行右旋:
以失衡结点5右子树9的左子树根结点6为支点,将失衡结点5的右子树9 右旋(顺时针旋转)。
如果该支点6有右孩子8,则将其8变为旋转结点9的左孩子。【前两张图】
② 左旋失衡结点本身
以失衡结点5的右子树根结点6为支点,将失衡结点5左旋(逆时针旋转)。
如果该支点6有左孩子,则将其变为旋转结点5的右孩子。【后两张图】
【 不分类时,凡是满足失衡结点平衡因子为-2,失衡结点右孩子的平衡因子为1的 都属于RL型。
平衡操作 还是需进行两次旋转。第一次对失衡结点 的右子树 进行右旋(顺时针旋转),第二次对失衡结点 进行一次左旋(逆时针旋转)操作,即可恢复平衡。 】
四种失衡情况判断及平衡操作
【直接根据失衡结点及其左/右孩子的 平衡因子,判断属于哪一种类型即可,
不用考虑插入前后结点是否为空,或者插入的是左子树还是右子树,也不用考虑插入结点距离失衡结点有多远。】
⭐【红黑树】
红黑树和平衡二叉树的区别
(1)平衡二叉树(AVL)的左右子树的高度差绝对值不超过1,严格保持平衡,只要不平衡就需要通过复杂的旋转操作来维护平衡,适用于插入与删除次数较少的情况。
(2)红黑树追求大致平衡(平衡性介于二叉排序树BST和AVL之间),左右子树的高度差在某些时刻可能会超过1,但只要符合红黑树的五个条件即可。
红黑树不符合自身定义的规则时,有些情况只通过颜色和一系列规则来维护平衡,即只改变颜色不用旋转,就能达到平衡。
红黑树其实现简单且性能良好,适用于大量数据的快速查找、插入和删除操作。