【问题标题】:Algorithm to recursivly go through a forest of children递归遍历儿童森林的算法
【发布时间】:2023-03-24 00:43:01
【问题描述】:

如果这是不好的做法,或者在某种程度上是一件坏事,请告诉我。事情是在我的程序中,我需要创建一个通过根元素和该元素的所有子节点的方法。我的元素是这样的:

|--ID--|--Parent--|--Additinal info--|
|  1   |    0     | root element     |
|  2   |    0     | root elemnet     |
|  3   |    1     |child element of 1|
|  4   |    1     |child element of 1|
|  5   |    3     |child element of 3|
--------------------------------------

现在,如果我想接收 ID 为 1 的元素的所有子元素(无论它有 1000 个子元素还是本例中只有 2 个子元素),我希望我的方法也能把它带给我,但我不知道该怎么做?所有这些元素都在一个列表中,这就是我正在使用的。每次我找到一个元素时,我都需要检查它是否有任何子元素,子元素也是如此。这是因为我需要以正确的顺序输出元素。我一直在想可能做,所以我先做一个布局的地图,然后用地图输出,但我有点坚持这个想法。

有什么线索吗?

【问题讨论】:

  • 列表是否以任何方式排序?可以找到 ID:1 的子元素作为列表中的第 n 个元素吗?
  • 不,这不是家庭作业 =) 我在 JSF 中构建了一个评论和评论树标记结构,我希望评论树能够设置最大深度级别。这样,在我的 commentTree 容器中,我可以设置评论标签的最大回复级别。如果您将最高级别设置为 2 并尝试回复回复回复,则您只会回复根。
  • no 恐怕列表没有排序

标签: algorithm recursion loops


【解决方案1】:

就像很多这些树问题一样,这里的神奇词是递归。您在表中描述的顺序是 ID 的顺序,它与深度或广度不完全匹配。但这没关系,您只需将节点放入一些数据结构中,这些数据结构将按照您想要的顺序返回它们。所以总体规划是

  • 递归地“遍历”树以查找所有节点;将节点插入到按 ID 排序的数据结构中
  • 打印有序节点

递归部分也很简单:

  • 从根节点开始

  • 如果根节点不在节点列表中,添加它

  • 取第一个子节点并做同样的事情。

类似(伪代码):

dfs(node, nodelist):
   if node not in nodelist
      insert node in nodelist
   for each child node n
      dfs(n, nodelist)

【讨论】:

  • 哇,这实际上是我让这个东西工作所需要的!非常感谢查理·马丁
  • 不客气。记得给调酒师和女服务员小费。
【解决方案2】:

在遍历节点的子节点时,您表示分层数据的方法非常低效。您基本上需要为每个节点发出一个查询。

我强烈建议您查看嵌套集模型 (explained in this page)。如果使用这种方法,则可以使用一个查询遍历节点的子节点,而不管树的深度或子节点的数量。

【讨论】:

    【解决方案3】:

    您必须实现类似,在列表中循环并针对列表的每个当前元素,查找子元素的数量,例如列表中元素的数量 where element.Parent = currentElementofList.Id .If此元素子元素计数大于零,您必须获取此子元素,并一直持续到列表中没有更多元素要循环为止。

    【讨论】:

      【解决方案4】:

      这听起来像是一个图遍历问题,所以我会将此列表转换为图结构(使用adjacency lists),然后使用DFSBFS 对其进行遍历。

      【讨论】:

        【解决方案5】:

        您需要的是adjacency list model

        查看文章以了解详细信息,但此方法允许您通过一次查询来检索树,并且结果很容易通过您的代码进行遍历。这是最快的随机树访问方法。

        【讨论】:

          猜你喜欢
          • 2018-10-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-08
          • 2019-04-20
          • 1970-01-01
          相关资源
          最近更新 更多