【问题标题】:Traverse every node of a tree to a given depth遍历树的每个节点到给定的深度
【发布时间】:2015-05-06 19:09:27
【问题描述】:

我有一棵二叉树,和家谱一模一样。以我所说的“领头孩子”为根,父母双方都在下面,然后是 4 位祖父母,然后是 8 位祖父母。所以基本上是一棵深度为 4 代的二叉树。

我希望能够遍历每个节点并提取每个节点的信息(即名称)并将其存储在一个数组中 - 该数组当然会有 4 代的 15 个元素(1+2+4+8 )。我正在努力递归地做到这一点。我在网上找到的所有使用常用方法(预购、有序、后购)的示例在到达空节点时都会停止,但这不是我想要做的:我想要每个节点被访问,但在所有节点都被访问过 4 代(或任何给定的代数)时停止。关键是在 4 代时停止,即使某些节点为空或 Null。任何人都可以提供解决方案? 这让我头疼很久了。感谢阅读

【问题讨论】:

  • 您是否正在寻找某种特定语言的答案?
  • 我在 MS Access 中使用 Visual Basic for Applications(我的数据存储在其中,但我想任何类似的伪代码都可以)

标签: algorithm tree


【解决方案1】:

这是 MIU 中的一个实现(虚构):

 traverse(node):
     traverse_(node, 0)

 traverse_(node, i):
     if i >= 4:
         return

     # Do stuff here.

     traverese_(node.left, i + 1)
     traverese_(node.right, i + 1)

现在你只需要在根节点上调用traverse

【讨论】:

  • 这将调用traverse_ 5 代 (i=0,1,2,3,4)。当然,你没有指定什么时候完成(即添加到数组中),所以这可能没问题。
  • 谢谢,已更正。 (当然,在标准 MIU 中 > 表示大于或等于,空行有副作用,但我意识到并不是每个人都熟悉这种语言。:-))
  • 我已经快速尝试了您的解决方案,它几乎可以工作 - 某处有一个小错误,因为某种原因它两次访问了几个节点 - 我必须手动执行它并查看问题出在哪里,但谢谢,这让我走上了正确的道路。非常感谢!
【解决方案2】:

递归深度优先搜索确实会在到达叶节点时停止,即没有任何子节点的节点(请注意,您可能在家族树中称为“父节点”的部分实际上称为“子节点” “从图论的角度来看)。然而,由于它是一种递归算法,“停止”只是意味着算法将返回到它所来自的节点,并尝试该节点的其他子节点。所以整个算法不会停止。一个标准的 DFS,无论是前缀、中缀还是后缀,都会访问整个树。您唯一需要做的就是在递归函数中添加一个额外的参数:一个跟踪当前深度的参数。

【讨论】:

  • 那一点让我很难过我害怕!
  • 查看 Ami Tavory 的答案 - i 是当前递归深度,在每个递归调用中,您将 i 增加 1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 2020-01-27
相关资源
最近更新 更多