2011-07-02 153 views
2

我已阅读和搜索,我还没有找出这个相对简单的问题的答案。递归搜索嵌套列表

我有一个类:

public class AccessibleTreeItem 
{ 
    public string name; 
    public List<AccessibleTreeItem> children; 

    public AccessibleTreeItem() 
    { 
     children = new List<AccessibleTreeItem>(); 
    } 
} 

这是一种通过一系列的功能并不真正在这方面无关紧要填充,但我正在寻找的是通过所有的搜索方式子列表中的项目,搜索特定的“名称”值,如果找到,则返回该列表。

这是如何以最简单的方式实现的,性能最低?谢谢 - 我一直在这个难忘的几天...

+0

你想要一个列表或一个项目返回? –

+0

这将是一个项目。应该只有一个结果返回....现在我想到了它,也许它应该是一个列表。我总是可以检查它里面有多少物品。 – HeWhoWas

+0

但是,找到所有物品的清单要比仅查找第一个物品贵得多。 –

回答

12
public class AccessibleTreeItem 
{ 
    public string name; 
    public List<AccessibleTreeItem> children; 

    public AccessibleTreeItem() 
    { 
     children = new List<AccessibleTreeItem>(); 
    } 

    public static AccessibleTreeItem Find(AccessibleTreeItem node, string name) 
    { 

     if (node == null) 
      return null; 

     if (node.name == name) 
      return node; 

     foreach (var child in node.children) 
     { 
      var found = Find(child, name); 
      if (found != null) 
       return found; 
     } 

     return null; 
    } 
} 
+0

没错,但这是深度优先搜索。在递归之前检查所有的孩子可能会更有效率。 –

+0

所以你说DFS比BFS效率低......嗯,不 - 它们是完全一样的 - 都只通过访问每个节点遍历一次。如果你不想递归,你可以迭代地执行BFS和DFS。 –

+0

我测试过代码,出于某种原因它总是返回null?我设置了断点并手动检查了AccessibleTreeItem节点 - 子对象在那里,但它嵌套在4个级别内。是否有无限数量的嵌套改变了这种工作方式? – HeWhoWas