当前位置: 首页 > 知识库问答 >
问题:

如何通过只保留所有树共有的节点来合并多棵树

戚逸清
2023-03-14

所以我有两到三棵树,它们是在执行一些代码时生成的。此树的每个节点都有一个属性,即它至少有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个孩子不同树中的相同级别,不管它有多少子级,也不管子级是否相同。

拜托,我有世界上所有的时间来做这个,这是为了个人目的,我想在这里学到一些东西,所以请不要建议任何图书馆。

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

共有1个答案

胡鸿志
2023-03-14

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

  • 把一棵空树和任何一棵树合并在一起,就会得到一棵空树
  • 把不同根的树合并在一起,就得到了一棵空树
  • 将两棵根相同的树r和子树c1。。。,cn和d1。。。,dn是通过生成一棵根为r的新树来完成的,其子树是具有相同根值的ci/dj和di的合并c

希望这有帮助!

 类似资料:
  • 假设我在一棵树中有一个节点,我如何获得所有的叶节点,它们的祖先是这个节点?我这样定义了TreeNode:

  • 我正在尝试使用 Jsoup 删除 HTML 页面标记之间的所有文本 例如,如果输入HTML是 输出应该是 基本上,我想删除返回的内容。 我找到了很多相反的帖子,只保留文本,但没有解决我的问题。知道怎么做吗? 编辑 maverick9999:https://stackoverflow.com/a/24292349/3589481提出的解决方案将解决大部分情况。 然而,正如评论中提到的,这个解决方案也

  • 我正在努力学习RCP中的TreeViewer。我为此写了一小段代码。 我的代码哪里有问题? 谢了!

  • 问题内容: 但是我 没有 关闭(展平)表,一个孩子可以有很多父母,并且ID遍历不一定是按顺序进行的。嵌套深度没有限制。 假设不可能使用循环引用…我想返回遍历层次结构所需的所有行。 假定下表​​: 给定我将如何编写单个查询以返回所有行(获取所有后代的Relationips)? 同样,假设我期望第2、3、4、7、8行 鉴于我希望第6和第10行 偶然的假阳性和结果中重复的行都是可以接受的。缺少行是不可接

  • 我有一个可能很大的根树结构,我想将其转换为矩阵,是树中的叶子数量,是树中度数大于1的节点数量,即根节点和内部节点。矩阵应按如下方式填充: mi, j = { 如果叶有祖先,1否则 例如,这棵树: 将转换为此矩阵: 由于树木可能会变得非常大(可能约为100,000片叶子),我想知道是否有一种比为每个叶子节点遍历树更聪明/更快的方法。感觉某种算法在某个地方遇到了这个问题,但我还没有弄清楚。也许有人可以

  • 我目前正在尝试实现一个树(不是二进制的,顺序不重要,不是定向的)数据结构。当一棵树的根与另一棵树的子节点相同时,我希望将树合并在一起 第一棵树的子树应该成为第二棵树的子树,第二棵树的子树与第一棵树的根相同。要合并的树可能更深。 我实现了像这样: 然后我有一个树列表