16 - 12 - 11 平衡二叉树 ( AVL树 )

来源:互联网 发布:天地知我心二作品顺序 编辑:程序博客网 时间:2024/04/28 16:45

平衡二叉树:
首先是一棵二叉排序树。左右子树的高度差最多等于1.而且每一个根节点的左右子树也都是二叉平衡树。
左子树深度 - 右子树深度 叫做平衡因子 ( BF: balance factor )
BF = -1,0,或1。

其查找/插入/删除的 时间复杂度都是 O(logn),是非常好的~

/*对于一端插入代码来说,我们只需要构建:*/int i;int a[10] = {3,2,1,4,5,6,7,10,9,8};BiTree T = NULL;int taller;for(i = 0 ; i < 10 ; i++){    InsertAVL(&T , a[i] , &taller )}

详见:
http://blog.csdn.net/sodaoo/article/details/53581952

我们要在插入构建时,每次插入一个节点后,都检查一下是否插入的这个节点破坏了某一个根结点的平衡性 (BF越界),
如何将一棵不平衡的二叉树变成平衡二叉树,平衡二叉树的失衡调整主要是通过旋转最小不平衡子树来实现的 。
最小不平衡子树:在新插入的结点向上查找,以第一个平衡因子的绝对值超过1的结点为根的子树称为最小不平衡子树。也就是说,一棵失衡的树,是有可能有多棵子树同时失衡的,而这个时候,我们只要调整最小的不平衡子树,就能够将不平衡的树调整为平衡的树。
简单的经过左右旋可以平衡,但是下图左旋后并没有平衡。。下面会有讲解~


↑ 对不平衡的树进行旋转的时候,不仅需要考虑需要最小失衡子树的根结点的平衡因子,还要考虑根结点较高子树的根结点的平衡因子。如图11中,较高子树为右子树,右子树不同,旋转后有着完全不同的结果。

为了方便讨论,我们使用连续的两个字母来表示平衡因子,以表示各种不同的情况。第一个字母表示最小不平衡子树根结点的平衡因子,第二个字母表示最小不平衡子树较高子树的根结点的平衡因子。使用L表示左子树较高,R表示右子树较高,E表示左右子树等高。如上述图11,根为的平衡因子L,较高子树的根为L,我们将这种情况表示为LL型,再如上述例子3,根为R,较高子树的根为L我们将这种情况称为RL型。

↓ 图片顺序从左往右看。结点加入的顺序是:
————————————{3,2,1,4,5,6,7,10,9,8}
这里写图片描述这里写图片描述

鸣谢:
htp://www.tuicool.com/articles/IJ7vYv

1 0
原创粉丝点击