平衡二叉树资料

二叉排序树(又叫二叉查找树)具有log(n)的执行效率,但是在极端情况下(构建的二叉树为单分支)查找的时间效率为n。为避免极端情况的出现,需要对二叉排序树平衡化,即通过算法保证左右每一颗子树的左右子树的高度差的绝对值不超过1,这样的二叉树叫做平衡二叉树。平衡二叉树的常用算法有红黑树、AVL、Treap、伸展树、左偏树等。数据结构的教材上讲的平衡二叉树是AVL树。

1、AVL的插入算法描述

在平衡的二叉排序树T上插入一个关键码为kx的新元素,递归算法可描述如下:

㈠若T为空树,则插入一个数据元素为kx的新结点作为T的根结点,树的深度增1;

㈡若kx和T的根结点关键码相等,则不进行插入;

㈢若kx小于T的根结点关键码,而且在T的左子树中不存在与kx有相同关键码的结点,则将新元素插入在T的左子树上,并且当插入 之后的左子树深度增加1时,分别就下列情况进行处理:

⑴ T的根结点平衡因子为-1(右子树的深度大于左子树的深度),则将根结点的平衡因子更改为0,T的深度不变;

⑵ T的根结点平衡因子为0(左、右子树的深度相等),则将根结点的平衡因子更改为1,T的深度增加1;

⑶ T的根结点平衡因子为1(左子树的深度大于右子树的深度),则若T的左子树根结点的平衡因子为1,需进行单向右旋平衡处理并且在右旋 处理之后,将根结点和其右子树根结点的平衡因子更改为0,树的深度不变;若T的左子树根结点平衡因子为-1,需进行先左后右 双向旋转平衡处理,并且 在旋转处理之后,修改根结点和其左、右子树根结点的平衡因子,树的深度不变。

㈣ 若kx大于T的根结点关键码,而且在T的右子树中不存在与kx有相同关键码的结点,则将新元素插入在T的右子树上并且当插入之后的右子树深度增加1时,分别就不同情况处理之。其处理操作和 ㈢ 中所述相对称。音频讲解

平衡的调整共有四种情况:分别为LL,LR,RR,RL。下面给出四种情况的动画演示:

(1)LL型

(2)LR型

(3)RL型

(4)RR型

2、AVL树插入的图形描述

(1)、 如何回溯修改祖先结点的平衡因子

我们知道,在AVL树上插入一个新结点后,有可能导致其他结点BF值的改变,哪些结点的BF值会被改变?如何计算新的BF值呢?要解决这些问题,我们必须理解以下几个要点:只有根结点到插入结(橙色结点)点路径(称为插入路径)上的结点的BF值会被改变。如图2所示,只有插入路径上结点(灰色结点)的BF值被改变,其他非插入路径上结点的BF值不变。
clip_image001

当一个结点插入到某个结点的左子树时,该结点的BF值加1(如图2的结点50、43);当一个结点插入到某个结点的右子树时,该结点的BF值减1(如图2的结点25、30)。如何在程序中判断一个结点是插入到左子树还是右子树呢?很简单,根据二叉查找树的特性可以得出结论:如果插入结点小于某个结点,则必定是插入到这个结点的左子树中;如果如果插入结点大于某个结点,则必定插入到这个结点的右子树中。
修改BF值的操作需从插入点开始向上回溯至根结点依次进行,当路径上某个结点BF值修改后变为0,则修改停止。如图3所示,插入结点30后,首先由于30<43,将结点43的BF值加1,使得结点43的BF值由0变为 1;接下来由于30>25,结点25的BF值由1改为0;此时结点25的BF值为0,停止回溯,不需要再修改插入路径上结点50的平衡因子。道理很简单:当结点的BF值由1或-1变为0,表明高度小的子树添加了新结点,树的高度没有增加,所以不必修改祖先结点的平衡因子;当结点的BF值由0变为1或-1时,表明原本等高左右子树由于一边变高而导致失衡,整棵子树的高度变高,所以必须向上修改祖先结点的BF值。
clip_image002

(2)、 何时进行旋转操作?如何判断作什么类型的旋转?

在回溯修改祖先结点的平衡因子时,如果碰到某个结点的平衡因子变为2或-2,表明AVL树失衡,这时需要以该结点为旋转根,对最小不平衡子树进行旋转操作。由于是从插入点开始回溯,所以最先碰到的BF值变为2或-2的结点必定为最小不平衡子树的根结点。如图4所示,插入39后,43和50两个结点的BF值都会变为2,而必定先访问到结点43,所以43是最小不平衡子树的根。根据以上Flash动画演示所示,旋转操作完成后,最小不平衡子树插入结点前和旋转完成后的高度不变,所以可以得出结论:旋转操作完成后,无需再回溯修改祖先的BF值。这样,图4中的结点25和50的平衡因子实际上在插入结点操作完成后的BF值不变(对比图2)。
clip_image003
3、AVL树的算法实现

(1)C/C++版本

http://webtrados.llh4.com/upload/avl.txt

(2)c#版本

http://www.cnblogs.com/abatei/archive/2010/12/31/1335031.html

4、相关参考资料

(1)、平衡二叉树算法http://wenku.baidu.com/view/e3bc9e0bf78a6529647d534d.html

(2)、C#与数据结构--树论--平衡二叉树(AVL Tree):http://www.chenjiliang.com/Article/View.aspx?ArticleID=13738,原版应出自http://www.cnblogs.com/abatei/archive/2010/12/31/1335031.html,不过很可惜的是它的flash挂了。

(3)、平衡二叉树课程设计:http://webtrados.itrenlife.com/upload/平衡二叉树课程设计.doc

(4)、平衡二叉树插入过程动画演示:http://ds.fzu.edu.cn/fine/resources/FlashContent.asp?id=68

(5)、平衡二叉树创建、插入代码:http://webtrados.itrenlife.com/upload/平衡二叉树.rar

 

 

本文来源于网络小筑 http://webtrados.itrenlife.com/ , 原文地址:http://webtrados.itrenlife.com/post/522.html

posted on 2011-01-02 14:22  网络小筑  阅读(403)  评论(0编辑  收藏  举报

导航