算法导论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,可以按照这样的方式去进行,首先转换根结点,保证两个子树规模相等,然后递归左、右子树的根结点即可
- 算法导论13.2-5 二叉树T1右旋转换成T2,右旋次数为O(n^2)
- 经过AVL单旋转,任意二叉查找树T1可以变换成另一颗(具有相同关键字的)查找树T2
- 算法导论 10.4-5 O(n)时间非递归遍历二叉树
- 算法导论 10.4-2 O(n)时间 递归遍历二叉树
- 算法导论 10.4.5 O(1)空间遍历二叉树
- 算法导论 10.4-3 O(n) 二叉树 非递归遍历
- 树T1交换其(某些)左右节点的左右儿子变换成树T2,则是同构。给出一个多项式时间算法以决定是否两棵树同构
- 算法导论 10-4-5 O(n)时间 O(1)空间遍历树
- 判断树T2是否为T1的子树
- 020给定两个二叉树T1,T2判断T1是否是T2的子树(keep it up)
- 算法导论之最坏情况下为O(n)的选择算法
- 设有n项任务,加工时间分别表示为正整数t1,t2,...,tn。背包问题系列
- 算法导论 O(n)时间内反转单链表
- 《算法导论》线性时间O(n)排序
- 算法导论 习题10.4-5 二叉树的遍历(非递归,O(1)存储)
- 算法导论6.3-3 证明完全二叉树高度为h的结点个数上限「n/2^(h+1)」
- 平衡二叉树创建,左旋,右旋,左平衡和右平衡
- 时间复杂度为O(n)的非递归单链表反转【算法导论课后题】
- dojo Memory tree
- 写了一个jQuery图片轮转插件
- 闲着无事,自己写的电脑wifi共享软件---WiFi Freedom
- 哈希表(REDIS_HASH)
- ubuntu中文latex环境
- 算法导论13.2-5 二叉树T1右旋转换成T2,右旋次数为O(n^2)
- 几种常见的排序算法小结
- CPU 的 cache 和 latency
- 从今天开始写blog
- HttpClient 关于 cookie rejected的错误
- 自定义标签实现过滤敏感字符
- 分布式搜索Elasticsearch——批量创建索引
- Git
- 李开复给程序员的七个建议