【问题标题】:How to merge multiple trees by retaining only those nodes which are common to all the trees如何通过仅保留所有树共有的节点来合并多棵树
【发布时间】:2014-01-15 23:32:34
【问题描述】:

所以我有两到三棵树,它们是在执行某些代码期间生成的。这棵树的每个节点都具有这样的属性,即它将具有最少 0 个子节点到最多 8 个子节点。所以我猜你可以得到这种完整树的图片,它在 0 级有一个根节点。在级别 1 8 个节点,在级别 2 64 个节点,依此类推。父节点的每个子节点编号从 0 到 7,我将它们存储为 java 中的字节整数类型,顺便说一句,我正在 java 中制作它。

现在我需要合并我生成的这两到三棵树,并且我完全不考虑给定节点的子节点,按级别进行操作。如果在级别 1 的三棵树的发言权,如果树 1 有 4,5,6,树 2 有 5,6,7,树 3 有 2,5,6,我的结果树应该有 5,6是三棵树的共同点。我不关心树 1 的第 5 个节点是否有 4 个子节点,而树 2 中该级别的第 5 个节点是否有 3 个子节点。如果一个节点在某个级别上标记为 5,则假设它与不同树中同一级别上标记为 5 的节点相同,而不管它具有的子节点数量或子节点是否相同。

因此,为了直观地陈述我在第二段中提到的内容,以确保没有歧义,我还附上了这三个图表。前两个合并得到第三棵树。

并且请我在世界上拥有所有时间来制作这个,这是出于个人目的,我正在尝试在这里学习一些东西,所以请不要推荐任何图书馆。

我正在考虑的解决方案包括为每棵树创建一个队列,并对这三棵树进行级别顺序遍历,并将遇到的节点添加到队列中。在我开始添加给定节点的子节点之前,我看到了这三个队列的共同点!我在结果树中设置了公共部分节点。但我想知道是否有比这更有效的解决方案。

【问题讨论】:

  • A -1 并且没有提到他为什么给我一个 -1 :|这个问题有什么歧义吗?我是否遗漏了任何重要信息?我是否在错误的堆栈交换站点上发布了这个?这是一个编程问题,我想不出它应该得到 -1 的任何理由!
  • 问题对我来说似乎没问题。遍历左边的树,你只是想找到两组孩子的公共部分([4, 5, 6] + [1, 2, 3, 4, 5, 6] = [4, 5, 6])? stackoverflow.com/questions/2851938/…
  • 这正是我想通过图中突出显示@zapl 的问题。你看到集合 A 中的 [4,5,6] 可能与第二组中的 [4,5,6] 相同,也可能不同。如果他们来自同一个父母,他们是相同的。现在我也可以将父 ID 存储在节点中。所以它将是 [4-4,4-5,4-6,5-1,5-2,5-3] 和 [4-1,4-2,4-3,4-4,4-5 ,4-6]但是对于 8 个级别,这棵树占用了 33MB 的内存。所以一个节点上额外的 32 位长指针将使它成为 66mb !
  • 每个节点可以有一个SetNode 作为子节点。只需找到一个匹配节点,与集合相交并递归到剩余的子节点。
  • 发布此链接和链接,我将接受它作为解决方案。

标签: java algorithm data-structures tree


【解决方案1】:

假设在这两种情况下树和子树的相对顺序相同,您可以使用简单的递归算法将树合并在一起:

  • 将一棵空树和任何一棵树合并在一起会产生一棵空树。
  • 将具有不同根的树合并在一起会产生空树。
  • 将具有相同根 r 和子级 c1、...、cn 和 d1 的两棵树合并在一起,... ., dn 是通过产生一棵新树来完成的>i 和 di 具有相同的根值。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2018-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    • 2015-01-19
    • 2019-05-24
    相关资源
    最近更新 更多