AVL树原理理解:旋转与平衡

AVL树原理理解:旋转与平衡

首先抱歉因为大一军训托更了两周
欢迎讨论数据结构与算法相关内容,请联系waangrypop$gmail丶com,或者直接来ZJU找我。
前情提要:https://blog.csdn.net/angrypop/article/details/82025816

1.大危机

假如要构建BST(Binary Search Tree)的数组本身是严格递增的…
插入后的结果如图所示,查找树会退化成一条链,构造将毫无意义,不会带来任何效率提升。
AVL树原理理解:旋转与平衡_第1张图片

2.平衡

上图的核心问题就在于树地结构彻底地偏向了右方。
在 1962 年,俄罗斯数学家 G. M. Andel’son-Vel-skii 和 E. M. Landis 发明了第一种自平衡二叉查找树,叫做 AVL 树。AVL 树必须维持如下平衡条件,对每个节点 :

其左子树的高度(或称深度)与右子树的高度的差至多是 1。

也就是说,其只能成如下形状:
AVL树原理理解:旋转与平衡_第2张图片

AVL树的插入操作与BST相同,采用不断地比较大小直到跳到叶节点。
只是,插入新节点后可能会破坏平衡性质。
对此,我们采用动态处理办法维持平衡。

很容易证明,每插入一个节点,可以通过至多1次旋转使其恢复平衡。
那么,我们从插入的节点向上回溯,直到找到第一个不平衡节点,便对以其为根节点的(子)树开始旋转。

3.旋转

先看一些例子,直观感觉一下旋转:
AVL树原理理解:旋转与平衡_第3张图片
AVL树原理理解:旋转与平衡_第4张图片
这两幅图都是单旋转的例子。
图一是最简单的情况。以红节点为根的子树不平衡,旋转后变成以黄节点为根。注意上节课讲的BST的性质,这整颗子树的任一节点都比紫结点要大,所以不论如何旋转其都在紫结点的右侧。
图二相比图一,多了一个特征:旋转后为保持二叉树的性质,子树B被过继给了节点5。具体操作非常容易。

但,还有更为困难的情况:双旋转
AVL树原理理解:旋转与平衡_第5张图片
若直接旋转,转后将不满足BST的性质。
我们需要先对以3为根的子树单旋转一次,再对以5为根的子树单旋转。

综合起来,总处理步骤如下:
*参考http://www.cnblogs.com/vamei/archive/2013/03/21/2964092.html

  1. 按照BST的方式新增一个节点。

  2. 从新增节点开始,回溯到第一个失衡节点。

  3. 找到断边(失衡节点与其父节点的连边),并确定断边的方向。

  4. 以断边下端为根节点,确定左右子树中的哪一个深度大。(因为BST的插入规则,两子树的深度不可能相等,且深度大的子树含有新增节点。)

  5. 如果第2和第3步中的方向一致(都为左或者都为右),需要单旋转以失衡节点为根节点的子树。否则,双旋转以失衡节点为根节点的子树。

你可能感兴趣的:(数据结构)