2011-07-02 201 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