在算法导论 - 创造性方法一书中,问题4.24:
设T1和T2为两个任意树,每个树有n个节点。证明向T1施加最多2n转是足够的,因此它等于T2。
对于二叉搜索树,我想出了一个算法:
找到等于T2根的元素,让它称之为target-root。
使用AVL旋转策略,旋转target-root使其成为T1的新根 在此过程中,可以执行多次旋转。
对于T1和T2的左子树,递归处理它们 对于T1和T2的右子树,以递归方式处理它们。
该算法在最坏情况下以O(N ^ 2)运行。
我不太明白“任意树”这个短语,我无法弄清楚如何使T1等于T2。
有人可以帮忙解决这个问题吗?
答案 0 :(得分:0)
从我得到的任何东西,我可以提出一个算法,可以解决O(N)旋转中的这个问题,但无法得到确切的上限,但认为你可以建立在这个: -
这是算法的伪代码: -
//Method to make T1 equivalent to T2
alignTree(T1,T2) {
if(length(T1)==1)
return
else {
Node k = FindRoot(T1,T2)
rotateAbout(k)
align(T1.left,T2.left)
align(T1.right,T2.right)
}
}
假设FindRoot
找到T1的节点,该节点被认为是新树的根,它是等效树。假设rotateAbout(K)
对root进行适当的旋转,以获得新树的左右子树上的等效节点。然后我们可以递归地求解较小子树上的较小子问题。
轮换次数正如您在伪代码中看到的,旋转次数相当于pre-order
O(N)
遍历
注意:您可以随时为常规树扩展上述伪代码,但仍然具有相同的复杂性。