📜  如何将字符串插入 AVL 树

📅  最后修改于: 2022-05-13 01:57:16.835000             🧑  作者: Mango

如何将字符串插入 AVL 树

AVL 树是一种自平衡二叉搜索树 (BST),其中所有节点的左右子树的高度差不能超过一个。

例子:

上面的树是 AVL,因为每个节点的左右子树的高度之间的差异小于或等于1 。下面是不是 AVL 树的示例:

上面的树不是 AVL,因为 8 和 12 的左右子树的高度差大于 1。它可以定义为一种二叉搜索树,其所有节点的平衡因子为 -1 、0 或 1。

什么是平衡因子:它是两个子树之间的高度差。 (平衡因子:左子树高度 - 右子树高度)

在 AVL 树中插入字符串

下面的示例演示在顺序中插入星期几: {Tuesday, Monday, Thursday, Saturday, Sunday, Friday, Wednesday}

方法:

  • 如果节点为空( NULL ),则使用给定的第一个值创建节点。
  • 如果新节点小于前一个节点,则在左侧插入新节点
  • 如果新节点大于前一个节点,则在右侧插入新节点

检查树是否平衡:

  • 如果平衡因子大于1 ,那么它可以是:
    • Left-Left Case(然后需要单次旋转以使其平衡)。
    • 或左右大小写(需要双旋转)。
  • 如果平衡因子小于 -1,那么它可以是:
    • Right-Right Case(需要单次旋转)。
    • 或左右大小写(需要双旋转)

应重复此过程以插入所有剩余节点。

要记住的要点

  • 相应地插入节点:为了确保给定的树在每次插入后保持 AVL,增加标准 BST 插入操作以执行一些重新平衡。以下是可以在不违反 BST 属性的情况下重新平衡 BST 的两个基本操作(keys(left) < key(root) < keys(right))
  • 检查平衡因子:平衡因子应始终为 -1、0、1,如果不是,则需要相应地旋转树。

创建 AVL 树的步骤

  • 所以根据给定的顺序,让我们插入Tuesday ,因为它没有节点,所以它的平衡因子0

  • 下一步是将星期一插入星期二的左侧,因为它按字母顺序较小(M < T) 。在插入新节点之前,需要检查每个节点的平衡因子。这棵树是平衡的,因为星期二是平衡的,因为它的左侧有一个子树:

因此,树是平衡的。由于平衡因子 0,星期一也是平衡的。

  • 接下来,插入Thursday 。它插入到星期二的左侧(如 Th < Tu) ,并插入到星期一的右侧(如 T>M) 。现在如果检查平衡因子,可以看出星期二的平衡因子是2所以它是不平衡的,所以需要旋转树使其平衡。

  • 之后,在星期四的左侧(S < T)和星期一的右侧(M < S)插入星期六
  • 星期日插入到星期六(Sa < Su)的右侧。现在树是不平衡的,所以它被旋转以使其再次平衡。

  • 按照同样的规则插入星期五,星期四的平衡因子变为 2,因此再次进行轮换。

  • 旋转后,现在将最后一个节点星期三插入到星期二的右侧(如 T

如果检查 AVL 树,则现在整个 AVL 树是高度平衡的,因为所有节点的平衡因子为-1 , 0 , 1