假设我们有一组二进制树,它们具有inorder和preorder遍历,并且没有树是给定集合中另一棵树的子树。现在给出另一个二叉树Q.find它是否可以通过连接给定集合中的二叉树形成。(虽然连接集合中的每个树应该最多考虑一次)连接操作意味着:
选择集合中任何树的根并将其挂钩到另一棵树的任何顶点,以便生成的树也是二叉树。
我们可以使用LCA(最不常见的祖先)做到这一点吗?还是需要任何特殊的数据结构才能解决?
答案 0 :(得分:1)
我认为二叉树结构应该足够了。我认为您不需要任何其他特殊数据结构。
我不明白你将如何使用LCA。据我所知,LCA用于了解同一棵树中两个NODES的最低共同祖先。它无法比较两棵树。 (这是我要做的,以检查是否可以形成Q)
我的解决方案。
必须检查树Q是否可以从树集中制作,所以我会采用自上而下的方法。基本上将Q与从该组形成的可能树进行比较。
逻辑: 如果Q.root与集合中的任何树的根不匹配(A,B,C ...... Z ......),则无法解决问题。
如果Q.root匹配树根(例如A),则检查相应的子项并将A标记为已使用/已访问。 (这是我从问题中理解的:一棵树只能使用一次)
我们应该在我们的解决方案中继续使用A,只要所有Q的孩子都匹配A的相应子项。(我会做Depth First遍历,广度优先也可以。)
我们可以添加从集合中添加一个新树(即仅在A的叶节点处附加新的根(树B),因为我们必须维护二叉树)。跟踪附加B的位置。
对A进行相应的检查以及相应的子对比。如果不匹配,则删除B并尝试在添加B的位置添加C树。
我们继续这样做,直到Q中的节点耗尽为止。(除非我们想要IDENTICAL MATCH,在这种情况下我们会尝试除我们之外的其他树组合,它们匹配Q但有更多节点)。
为冗长的冗长答案道歉。 (我觉得我的伪代码很难编写,并且有很多注释需要解释)。
希望这会有所帮助。
另一种解决方案:效率会低得多(只有树的数量相对较少时才尝试):形成所有可能的树集(首先是2s然后是3s ...... N)并且检查已形成的树它们与Q相同。 比较部分可以在这里提到: http://www.geeksforgeeks.org/write-c-code-to-determine-if-two-trees-are-identical/