平衡二叉树(AVL树)的递归式性质推导

本文详细解释了AVL树的性质,包括其定义、高度与节点数的关系,以及插入和删除操作后如何通过左旋和右旋等操作恢复平衡。作者以递归方式推导出AVL树的形式,并证明了关键定理,如平衡二叉树的节点数下限与高度的关系。
摘要由CSDN通过智能技术生成

阅读提示:本文包含很多乱七八糟的证明,读者在阅读时可以跳过证明部分,直接阅读定理,如果遇到有疑问的定理再阅读证明部分。

作者的废话:在查阅有关于avl树的资料的时候,我发现网络上的文章对于avl树的性质谈论的比较少,大多将目光放在avl树的实现上。这样的文章很实用,但是读来让人有些知其然而不知其所以然。因此我写了这篇文章,希望能帮助你更好的理解avl树。

本文采用定义/定理加证明的方式组织起对avl树性质的讨论,因为作者是本科生,受自己的数学分析教材影响比较深,所以习惯用这种方式组织文章。各种证明可能不甚严谨,如有缺漏烦请指出,感谢。

定义1:平衡二叉树是满足以下两条性质任意者的一棵二叉查找树:

        (1):若一棵树的根节点的左子树和右子树均为平衡二叉树,且左子树和右子树高度差的绝对值小于等于1;

        (2):若 一棵树为空的

约定:在本文中,总是将一棵AVL树记作A,或Ai(i=1,2...),将一棵AVL树的高度记作h(A)或h(Ai).

根据以上的定义,我们可以递归地推导出AVL树应有的形式:

定理1:

高度为1的AVL树是一棵   只有根节点的树.

高度为2的AVL树是一棵   根节点左右子树分别只有一个结点或仅有左/右子树有一个结点的树.

高度为k(k>=3)的AVL树是一棵   根节点左右子树中  有一棵为高度为k-1的AVL树,另一棵为高度为k-2或k-1的AVL树  的树.

e9beae40d6c041459435ffb07826fed7.jpg

 

这样的递归式推导是本文的核心思想,而上面的十分简单的推导是下面一些定理的证明基础.

 

定理2(平衡二叉树的良好性质):平衡二叉树具有这样的性质:一棵高度为H的平衡二叉树至少含有

eq?%5Cfrac%7B1%7D%7B2%7D%283Fn+Ln-2%29

个节点(其中Fn为斐波那契数列的前n项和,Ln为卢卡斯(Lucas)数列的前n项和)

证明:设一棵高度为H的AVL树至少含有N(H)个节点,由定理1,有以下关系成立:

        N(1) = 1;

        N(2) = 2;

        N(H) = N(H-1) + N(H - 2) + 1;

        对上述递推式化简,运用数列求和的一般方法即可解得.

        本文对求解的具体过程不再赘述,事实上对以上递推关系式的求解过程十分繁琐,最后得出的结果也比较难看,但是这个定理的核心在于阐述:AVL树的节点数随着高度的增加指数级递增,换句话说,向AVL树中插入N个节点之后,AVL树的高度是lg(N)级别的.事实上,节点数随高度指数级增长是所有具有良好性质的查找树所必备的性质,也是他们对查找操作的低时间复杂度的根本来源.

        (作者在推导到这里的时候有过这样的想法:AVL树会不会就是脱胎于斐波那契数列呢?当我希望构造一种良好的树的时候,我希望树的节点数随高度指数级增长,那么当我联想到斐波那契数列时,一个自然的想法是使得一棵树的两棵子树都有着这样的性质,并且他们的高度不至于差的太多,那么这样的一棵树至少包含了两倍于他的较小的子树的节点数的节点数)

        在了解了AVL树的良好性质之后,我们面对的问题就只剩下了如何维护这样一棵树的良好性质.

        维护性质就是当一次操作破坏了AVL树的平衡之后,如何通过一些(简单的)操作将这棵树重新变回一棵AVL树以保持他的良好的性质,那么理所当然的我们应当首先研究对AVL进行一次插入/删除操作后它的性质会发生怎样的改变.

        首先,一棵不平衡的树有着相当多的可能存在形式,但是由一棵平衡树经过一次操作得到的不平衡树就简单许多,它应当是这样的:

        (1)左右子树中有且仅有一棵(一次操作最多破坏根节点的一棵子树的平衡性)是不平衡的(此时的左右子树高度差可能为0,1,2)

        (2)左右子树都是平衡的,但是它们的高度相差2

定理3-1:如果一棵AVL树在插入或删除一个节点后,原本的性质被破坏,那么一定能找到它的这样一个节点P:P的左子树和右子树都是平衡的,且P的左子树和右子树高度差恰好为2.称这时的以P为根节点的子树为这棵非平衡二叉树的最小非平衡子树

证明:设一棵AVL树在插入/删除一个节点后,变为了非平衡树,根据上面的讨论,它为以下两种树之一:

        (1)左右子树都是平衡的,但是它们的高度相差2

        命题自然成立。

        (2)左右子树中有一棵是不平衡的

        设插入/删除后该AVL树的高度为H,不失一般性,不妨设不平衡的为左子树,那么考虑左子树,它应当满足(1)(2)两种情况中之一,且它的高度至多为H-1.若满足(1),则命题成立,否则考虑它的不平衡子树,以此类推,直到研究的不平衡子树的高度减小到H=3(或者在这之前满足条件1)。对于一棵高度为3的树,由于高度小于3的不平衡树都为平衡的,故他是不平衡的当且仅当它的两棵子树是平衡的且高度差为2。命题证毕。

定理3-2:如果一棵AVL树在插入或删除一个节点后,原本的平衡性被破坏,那么只需构造出这样一颗树:它与最小非平衡子树有着相同的节点,并且高度为最小非平衡子树平衡被破坏前的高度,用这棵树替代最小非平衡子树,就可以使得原树回复平衡。

证明:在此不作严谨证明,直观的来看,如果使得最小非平衡子树的高度恢复原状,那么其上的任何子树的高度也都恢复原状了,如果使得最小非平衡子树的平衡性恢复,那么整棵树的平衡性也就恢复了(在高度恢复的基础上)。

定理3-1与定理3-2告诉我们,当一棵平衡二叉树因为一次操作平衡被破坏时,可以找到这样的唯一一列节点,它们互相连接,深度递增,且以它们为根节点的子树都是非平衡的,而这样一列节点是有穷的,最后会在某一处终止,而如果对终止处的最小非平衡子树作一些操作,就能使这棵树重新回复平衡。

接下来将考虑将一棵平衡被破坏的树回复平衡的操作,其他的文章将其称为左旋和右旋,因为作者自己也记不住左旋和右旋到底是怎么样的,所以接下来的部分只讲操作没有名字。

因为情况很少,所以直接分类讨论

以下讨论的均是最小非平衡子树

1一次插入后左边过深

ace02ba9e4fc4bc38f77fd7ca56ab315.jpg

 

bf13ec5295b14be39559c270ad4cf002.jpg

 2一次插入后右边过深,可以和上面的情况对称地操作

3一次删除后右边过浅

0818c6ca573d462393cb4837afe71584.jpg

如果左边不是两个h-2而是含有一个h-3,那就与插入的情况相同了,不再次讨论。 

删除在左边的情况是对称的。

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值