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

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

 证明过程相当简单,计算右旋最多执行的次数,如果其总次数为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,可以按照这样的方式去进行,首先转换根结点,保证两个子树规模相等,然后递归左、右子树的根结点即可

设计一个分治算法来判断两棵二叉树是否相同,可以通过递归地比较两棵的节点来进行。基本思路是,如果两棵都为空,那么它们相同;如果其中一棵为空,另一棵不为空,或者两棵的根节点的值不相同,那么它们不相同;如果以上条件都不满足,那么需要递归地比较左子树是否相同。 以下是分治算法的伪代码: ``` Function IsSameTree(T1, T2): 如果 T1 是空且 T2 是空: 返回 True 如果 T1 是空 或 T2 是空 或 T1 的值 不等于 T2 的值: 返回 False 左子树相同 = IsSameTree(T1 的左子树, T2 的左子树) 子树相同 = IsSameTree(T1子树, T2子树) 返回 左子树相同 且 子树相同 ``` 在实际编程中,需要将伪代码转换为具体的编程语言,比如Python、Java等。以下是Python语言的实现示例: ```python class TreeNode: def __init__(self, value=0, left=None, right=None): self.val = value self.left = left self.right = right def isSameTree(T1, T2): if not T1 and not T2: # 如果两棵都为空 return True if not T1 or not T2 or T1.val != T2.val: # 如果其中一棵为空,或者根节点值不同 return False # 递归比较左子树 return isSameTree(T1.left, T2.left) and isSameTree(T1.right, T2.right) # 使用示例 # 构建两棵,进行比较 # 1: 1 2: 1 # \ \ # 2 2 # / / # 3 3 tree1 = TreeNode(1, TreeNode(2, TreeNode(3))) tree2 = TreeNode(1, TreeNode(2, TreeNode(3))) print(isSameTree(tree1, tree2)) # 输出: True ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值