通过树旋转将一个二叉树转换为另一个二叉树

时间:2017-05-25 20:42:10

标签: algorithm rotation binary-tree

给出两个随机二叉树。我需要找到一个旋转序列,以便在完成它之后树一等于树二。

例如:

  • 第一个树以root为0,左为1,右子为
  • 树二以1为根,右子为0,零右子为2
  • 输出:在节点0周围向右旋转。

如何为随机二叉树做到这一点?

1 个答案:

答案 0 :(得分:1)

对于随机二叉树来说,这是不可能的。

例如,考虑这两棵树:树1的根为0,1为0的右子;树2的根为1,0为1的右子。很明显,我们不能通过旋转将树1转换为树2。

但是可以对随机二叉搜索树执行此操作(因为较大元素将位于较小元素的右侧)。我们可以在树1中找到树2的根,并将其旋转到根。然后我们进入左右子树以递归方式解决它们。

修改

如果确保答案始终存在,那么我们可以将它们视为二叉搜索树(因为旋转将保留二叉搜索树的属性)。实际上,我们可以重新标记两棵树的节点,将它们更改为二叉搜索树,但这不是解决这个问题的必要条件。

现在我们可以使用以下算法递归地将Tree#1更改为Tree#2。

procedure solve(tree1: the first tree, tree2: the second tree)
    return if either tree1 or tree2 is empty
    r := root of tree2
    find r in tree1 and rotate r to the root
    solve(left subtree of the root of tree1, left subtree of the root of tree2)
    solve(right subtree of the root of tree1, right subtree of the root of tree2)