簡體   English   中英

如何實現GetAllNodes方法以按級別順序返回所有節點的集合?

[英]How can I implement a GetAllNodes method to return a collection of all nodes in level-order?

public class TreeNode<T>
{
  private List<TreeNode<T>> _children = new List<TreeNode<T>>();
  public T Data { get; set; }
  public TreeNode<T> Parent { get; private set; }
  public ReadOnlyCollection<TreeNode<T>> Children {
    get {
      return new ReadOnlyCollection<TreeNode<T>>(_children);
    }
  }
  public void AddChild(TreeNode<T> child)
  {
    _children.Add(child);
  }
  public ICollection<TreeNode<T>> GetAllNodes()
  {
    throw new NotImplementedException();
  }
}

這種遍歷稱為廣度優先遍歷

public ICollection<TreeNode<T>> GetAllNodes()
{
    var allNodes = new List<TreeNode<T>>();
    var queue = new Queue<TreeNode<T>>();
    queue.Enqueue(this); // will include root node

    while (queue.Any())
    {
        var current = queue.Dequeue();
        allNodes.Add(current);
        foreach (var child in current._children)
            queue.Enqueue(child);
    }

    return allNodes;
}

工作原理:考慮以下樹

在此處輸入圖片說明

讓我們看看什么隊列[方括號]將包含什么以及將添加到結果(括號):

循環前:

  • 將根添加到隊列: [N0]

第一循環:

  • 從隊列中刪除的第一項:
  • 第一項添加到結果中: (N0)
  • N0所有子代都添加到隊列中: [N1-1][N1-2]

第二循環:

  • 從隊列中刪除的第一項N1-1[N1-2]
  • 添加到結果中的第一項: (N0)(N1-1)
  • N1-1所有N1-1都添加到隊列中: [N1-2][N2-1]

第三循環:

  • 從隊列中刪除第一個項目N1-2[N2-1]
  • 添加到結果中的第一項: (N0)(N1-1)(N1-2)
  • N1-2所有N1-2都添加到隊列中: [N2-1][N2-2][N2-3]

第四個循環:

  • 從隊列中刪除的第一項N2-1[N2-2][N2-3]
  • 添加到結果中的第一項: (N0)(N1-1)(N1-2)(N2-1)
  • N2-1所有子N2-1都添加到隊列中: [N2-2][N2-3][N3-1]

所有這些項目都沒有子項,因此進一步的循環只會從隊列中逐一刪除它們並將其添加到結果中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM