平衡二叉树

上篇文章分析了二叉结构,这篇文章讲解平衡二叉树(AVL),有二叉树就能够实现基本的算法结构,为什么还需要引入平衡二叉树呢,下面看一个二叉树示例。按照二叉排序树格式插入序列{1,2,3,4,5,6,7,8,9},如果不进行旋转将得到图 1中链式存储格式,当需要查找数字9需要比对9次,经过旋转后将的到图 1旋转后的结果,旋转后查找数字9仅仅需要4,当二叉树结点很大时,平衡二叉树将能够快速遍历到二叉树中每一个结点,访问次数log2n+1,如此看来,二叉树经过旋转后效率大大提升。

                                                                                                             图 1

什么是平衡二叉树?我们将二叉树上的结点的左子树深度的值减去右子树深度的值成为平衡因子BF,平衡二叉树就是一棵树上所有结点的平衡因子绝对值小于等于1的树。如果平衡因子大于1,就需要从最小不平衡结点(插入一个节点之后,距离这个插入节点最近的不平衡节点就是最小不平衡节点)开始旋转,所有的旋转都是在最小不平衡节点的基础上进行的。旋转有四种情况,分别如下:

  1. 左:节点插入在最小不平衡节点的左子树的左子树上,示例如图 1所示,图中3节点为最小不平衡节点,旋转也可以理解成如图 3所示的三角形按照某个节点进行顺时针或者逆时针旋转。

                                                          图 2 右旋转

3 三角形旋转法

  1. 右:节点插入在最小不平衡节点的右子树的右子树上,示例如图 4所示,图中1节点为最小不平衡节点。

4 左旋转

  1. 左右:节点插入在最小不平衡节点的左子树的右子树上面,示例如图 5所示,图中1为最小不平衡节点。

5 右左旋转

  1. 右左:节点插入在最小不平衡树的右子树的左子树上面,示例如图 6所示,图中3节点为最小不平衡节点。

6 左右旋转

到目前为止如何旋转已经非常容易理解了,旋转在项目中如何使用在后期文章中将以华容道算法作为讲解基础。旋转算法代码编写需要需要考虑如何进行树高判断,|左子树树高-右子树树高|<2。如果大于等于2则该节点就存在不平衡,需要进行旋转操作。因此在程序中节点中需要定义一个height属性来存储该节点的树高。下面讲解四个旋转函数模块函数模块。

  1. 数据类型定义如图 7所示,比普通二叉树结点定义多了一个树深度,用来比较该节点是否平衡。

7 数据类型

  1. 左右旋转算法如图 8所示,传入参数是一个节点的指针引用。

8 左右旋转

  1. 当结点插入左边引起树的不平衡需要进行左平衡,做平衡中需要判断上一个结点树深度的状况,左平衡如图 9所示。

9 左平衡

  1. 右平衡如图 10所示。

10 右平衡

学习平衡二叉树示为后面红黑树。华容道算法做铺垫。

 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页