算法导论13.2-5 二叉树T1右旋转换成T2,右旋次数为O(n^2)

来源:互联网 发布:centos 6 hadoop2.7.2 编辑:程序博客网 时间:2024/05/06 08:19

此问题个人思考良久,一朝得解,全身放松啊!

 证明过程相当简单,计算右旋最多执行的次数,如果其总次数为O(n^2),则命题一样得证。

        

         如果y属于x的右子树,则右旋之后,y仍然属于x的右子树

         考虑右旋操作的两个结点,y和y的左子结点x,右旋之后,y成为x的右子结点,以后无论再如何右旋,x都是y的祖先结点,所以x和y无法再在一起参与右旋了,即n个结点中任意两个结点,最多参与一次右旋,n个结点最多有C(n,2) = n(n-1)/2个组合,即最多有O(n^2)个右旋操作,命题得证


尝试用过数学归纳法(substitution method)证明,对于 n=1,2 时,显然;

 

假设所有m<n时,旋转次数T(m)<=cm^2

当结点总数为n时,考虑T2根结点的左子树结点数,必须比T1根结点的左子树结点数多,否则使用右旋作用到根结点上,只会减少根结点左子树的结点数,假设T2比T1 的左子树多k个结点。

对根结点作k次右旋,如此使用T1、T2的左右子树结点数相同,假设左子树有r个结点,右子树有s个结点,则r+s+1=n,使用数学归纳可得两个左子树转换的旋转次数,则总旋转次数有如下公式:

T(n) = k + T(r)+ T(s) <= k + c r^2 + c s^2 <= (r+s) + c r^2 + c s^2

 

需要证明存在正数c,使得T(n) <=c n^2 = c (r+s+1)^2成立,即证明

(r+s) + c r^2 +c s^2 <= c (r+s+1)^2 = c r^2 + c s^2 + c + 2c(r+s)

当c取1/2时不等式成立。

 

但这个证明有这样的一个前提,即如果T1可以右旋到T2,则必须经历根结点的k次右旋,需要证明右旋操作的交换律,比较复杂。

但是这种证明方法提供了一个具体转换思路,如果T1可以右旋到T2,可以按照这样的方式去进行,首先转换根结点,保证两个子树规模相等,然后递归左、右子树的根结点即可

原创粉丝点击