关于AVL树插入操作

时间:2016-03-23 23:27:49

标签: algorithm binary-search-tree avl-tree

在AVL树插入的标准过程中,在插入新节点后,我们将从下到上进行调整,在此过程中,子树高度可能会增加一(因为插入和旋转)操作),而子树(高度增加一个后),左/右孩子的身高仍然相同?如果是这样,一个例子是值得赞赏的,如果没有,如果有人能够解释原因,那将是很好的。谢谢。 :)

以下是对AVL树(https://en.wikipedia.org/wiki/AVL_tree

的引用

的问候, 林

2 个答案:

答案 0 :(得分:4)

来自Wikipedia Binary Tree page

  

平衡二叉树具有最小可能的最大高度(a.k.a.   对于叶节点,因为对于任何给定数量的叶节点   叶节点放置在尽可能高的位置。

     

一种常见的平衡树结构是二叉树结构   每个节点的左右子树的高度不再相同   比1

例如:

这是一棵平衡的树。

enter image description here

如果我们插入1,它的高度会增加1.但它又是一棵平衡的树。因为左右子树的高度不超过1。

enter image description here

BTW,AVL树是一种自平衡的二叉搜索树。因此插入后不可能失去平衡。因为在每次插入之后,树通过进行必要的旋转来平衡自身。

我认为你错误地使用了术语 balance 。您认为平衡没有高度差,但在定义中最多只有1个高度差。

你的问题:

  

在AVL树插入的标准过程中,子树高度可能增加一个(因为插入和旋转操作),而子树(高度增加一个之后)仍然具有相同的高度左/右孩子?

如果我们有一个从左右分支具有相同高度的树,并且如果我们将一个节点插入到左分支的叶节点中,则高度会增加,因为树的高度为maximum(height(left_branch, right_branch)) 。因为此操作后height(left_branch)等于height(right_branch)+1。所以,他们不能平等。

简而言之,您的前提是height(left_branch) == height(right_branch)

您的操作是increasing height of left_branch by 1

所以height(left_branch) == height(right_branch)条件不再是真的。

答案 1 :(得分:1)

插入后无法使子树的左右子项保持高度变化相同。

让我们考虑一个在子树中只有<3个节点的简单示例。平衡因子的可能性是,

  • +1 - 这是具有1个Left Child且没有Right child
  • 的子树中的Root节点
  • -1 - 这是具有1个右子项且没有左子项的子树中的根节点
  • 0 - 子树中的根节点在“右”和“左”中有1个节点。

对于具有余额系数+1的SubTree,

  • 如果我们插入右边,我们没问题
  • 如果我们插入左边,平衡因子会变为2.所以我们需要平衡树,在这种情况下,子树的高度会发生变化。

对于具有平衡因子-1的SubTree,

  • 如果我们插入左边我们就可以了
  • 如果我们插入右边,平衡因子会变为-2。所以我们需要平衡树,在这种情况下,子树的高度会发生变化。

对于具有余额系数0的SubTree,

  • 如果我们插入左边,我们就可以了。高度已更改,但子节点也已更改。
  • 如果我们插入右边,我们没事。高度已更改,但子节点也已更改。

因此,不可能改变高度并且仍然具有相同的左右儿童身高。