给出两个随机二叉树。我需要找到一个旋转序列,以便在完成它之后树一等于树二。
如何为随机二叉树做到这一点?
答案 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)