【问题标题】:How to search a tree for a specific node class如何在树中搜索特定节点类
【发布时间】:2012-04-01 06:27:48
【问题描述】:

我有一棵由Node 对象填充的树。每个节点都有一个 ArrayList 存储其子节点,因为可以有未指定数量的子节点,这与二叉树不同。

如果每个节点都有多个子节点,我如何遍历树以找到特定节点,其中每个子节点依次有自己的子节点,依此类推。我只是在寻找一种通用的迭代方式,例如使用一个函数来搜索节点的arrayList(存储子节点),以及每个子节点的后续子节点数组列表。

有什么建议吗?

更新

这是我迄今为止尝试过的:

return 
(
    (StrangeNode)current.ChildrenList
        .SingleOrDefault(c => 
            c.GetType().Name.ToString().Equals("StrangeNode"))
).myArrayList;

【问题讨论】:

  • mattgemmell.com/2008/12/08/what-have-you-tried 这听起来像是试图让 SO 做你的功课?
  • 这实际上不是作业,我正在尝试实现一棵树,它在树的某些点(即不同的类)具有特殊类型的节点
  • 他不是字面意思,你试过什么?
  • 这是我迄今为止尝试过的,但无济于事:return ((StrangeNode)current.ChildrenList.SingleOrDefault(c => c.GetType().Name.ToString().Equals ("StrangeNode"))).myArrayList;

标签: c# .net data-structures tree trie


【解决方案1】:

两种最明显的方法是深度优先搜索和广度优先搜索。您可以通过搜索在任何算法教科书或在线找到这两种方法的示例。您可以在 3-10 行代码中递归地实现深度优先搜索。

【讨论】:

  • 我已经用我迄今为止尝试过的内容更新了我的问题。如果可能的话,我想迭代地做这个,而不是递归地。
  • 迭代的好处是什么?
  • 真的没什么好处,我只是没掌握递归呵呵。
【解决方案2】:

你可以迭代地做这样的事情:

List<Node> nodes = new List<Node>();
nodes.add( rootnode )

for (int i=0; i < nodes.count; i++)
{

Node currentNode = nodes[i];

//do the processing to check here

nodes.add(currentNode.children) //not 100% sure how to do this, but you get the idea

}

如果你想递归完成它只是深度优先,非常容易。

【讨论】:

  • 我没有完全理解这一点 - 你的意思是我将所有孩子添加到一个数组中并在该数组中搜索“奇怪”节点?
  • 就是这样。检查当前节点,然后将子节点放入数组中。然后检查下一个节点,并将这些子节点也放入数组中。最后你会经历所有的孩子。
  • 但是,这将如何照顾孩子的孩子?
  • 当然会。首先,您将只有根节点。然后添加根的孩子。然后你转到下一个节点(子节点 1)——然后添加它的子节点——以此类推。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-10
相关资源
最近更新 更多