证明两棵树的最大转数变得相等

时间:2013-11-24 07:49:02

标签: algorithm tree avl-tree tree-rotation

算法导论 - 创造性方法一书中,问题4.24:

  

设T1和T2为两个任意树,每个树有n个节点。证明向T1施加最多2n转是足够的,因此它等于T2。

对于二叉搜索树,我想出了一个算法:

  1. 找到等于T2根的元素,让它称之为target-root。

  2. 使用AVL旋转策略,旋转target-root使其成为T1的新根   在此过程中,可以执行多次旋转。

  3. 对于T1和T2的左子树,递归处理它们   对于T1和T2的右子树,以递归方式处理它们。

  4. 该算法在最坏情况下以O(N ^ 2)运行。

    我不太明白“任意树”这个短语,我无法弄清楚如何使T1等于T2。

    有人可以帮忙解决这个问题吗?

1 个答案:

答案 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)遍历

注意:您可以随时为常规树扩展上述伪代码,但仍然具有相同的复杂性。