平衡二叉搜索树【AVL树】

先了解下 “平衡因子”:

平衡因子是某节点的左右子树的高度差。如下图,红字数字就是每个节点的平衡因子
平衡二叉搜索树【AVL树】_第1张图片

再次注意:节点下的红色数字表示的是 当前 节点的平衡因子
AVL树的特点:
  • 每个节点的平衡因子只可能是10-1(绝对值<=1,如果超过1,称之为"失衡")
  • 每个节点的左右子树高度差不超过1
  • 搜索、添加、删除的时间复杂度是O(logn)

如下图所示:
平衡二叉搜索树【AVL树】_第2张图片

平衡对比

假设输入数据:35, 37, 34, 56, 25, 62, 57, 9, 74, 32, 94, 80, 75, 100, 16, 82
平衡二叉搜索树【AVL树】_第3张图片

很明显,AVL树比普通二叉搜索树的高度要小,平衡因子只可能是 10-1
处理添加节点导致的失衡
  • LL-右旋转(单旋转)

平衡二叉搜索树【AVL树】_第4张图片

LL 表示的是失衡的左边的左边添加的节点。上图所示,在 n节点添加节点后,导致 g节点失衡了, n节点g节点的左子树的左子树中,用 LL表示,此时将失衡节点 g进行 右旋转就恢复平衡了。如下图所示:

平衡二叉搜索树【AVL树】_第5张图片

(1): g.left = p.right,(2): p.right=g,(3)让 p节点成为这颗子树的根节点
  • RR-左旋转(单旋)

平衡二叉搜索树【AVL树】_第6张图片

RR表示的是失衡节点的右边的右边添加的节点。如上图所示,在 n节点再添加一个节点,导致的 g节点失衡,而 n节点g节点的右子树的右子树中,用 RR表示,此时将失衡节点 g进行 左旋转就能恢复平衡了,如下图所示:

平衡二叉搜索树【AVL树】_第7张图片

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

平衡二叉搜索树【AVL树】_第8张图片

LR- RR 表示的是失衡节点的左边,然后右边添加了一个节点。如上图所示,在 n节点处添加了一个节点,导致了 g节点失衡,而 n节点在 g节点的左子树的右子树中,就用 LR- RR表示。此时需要先对 p节点进行左旋转,再对 g节点进行右旋转就能恢复平衡了。
平衡二叉搜索树【AVL树】_第9张图片
  • RL-LL右旋转,RR左旋转(双旋)

平衡二叉搜索树【AVL树】_第10张图片

RL- LL表示的是在失衡节点的右子树的左子树上的节点添加了一个节点导致的失衡,如上图所示,在 n节点添加一个节点,导致 g节点失衡,此时 n节点g节点的右子树节点的左子树中,此时先对 p节点进行右旋转,然后再对 g节点进行左旋转就能恢复平衡了

平衡二叉搜索树【AVL树】_第11张图片

你可能感兴趣的:(前端,数据结构,二叉树)