给定两个完整二叉树的级别顺序遍历,如何检查一棵树是否是其他树的镜像?

时间:2014-12-18 19:51:46

标签: algorithm tree binary-tree mirror

如何检查两个完整的二叉树是否相互镜像,只给出了树的水平顺序遍历?

完整二叉树是一个二叉树,除叶子节点外的所有节点都有2个子节点。

2 个答案:

答案 0 :(得分:4)

我不认为这是可能的。考虑这两棵树:

   0              0
  / \          /     \
 1   2        1       2
    / \      / \     / \
   3   4    3   4   5   6
  / \
 5   6

这些是完整的二叉树(根据您的定义),即使它们是不同的树,它们也具有相同的级别顺序遍历:0123456。

现在,看看他们的镜子:

    0              0
   / \          /     \
  2   1        2       1
 / \          / \     / \
4   3        6   5   4   3
   / \
  6   5

请注意,左侧树具有级别顺序遍历0214365,而右侧树具有级别顺序遍历0216543.换句话说,原始树具有相同级别顺序遍历,但它们的镜像具有不同的遍历。

现在,考虑如果你有你的算法会发生什么,你输入0123456(任一树的水平顺序遍历)和0214365(其中一个镜像的水平顺序遍历)。算法可以说什么?如果它说它们会反映出来,那么如果你输入第二个输入树就会出错。如果它说它们不是镜像,那么如果你输入第一个输入树就会出错。因此,算法无法始终产生正确的答案。

希望这有帮助!

答案 1 :(得分:0)

根据一般定义,在完整的二叉树中,除了可能是最后一个之外的每个级别都被完全填充,并且所有节点都尽可能地离开。因此,完整的二叉树可以具有仅具有一个子节点的节点(例如,具有一个左子节点的一个根节点是完整的二叉树)。除了叶子之外的所有节点都有2个子节点的树称为完整二叉树。

对于完整的二叉树,问题将是微不足道的。从上到下开始,对于ith级别,您需要比较给定级别顺序遍历A和B的2^i元素(根为0th级别)。对于任何给定i,来自A的2^i元素集合应该等于来自B的这些元素的反面。但是,最后一个级别可能没有完全填充,您需要考虑到

对于完整的二叉树,其中唯一的约束是每个节点有2个子节点或没有子节点,除非你自己构造了树,否则它是不可能的。并且您不能仅使用级别顺序遍历来构造树。 templatetypedef提供了一个很好的例子。