![](/img/trans.png)
[英]How can I implement a method to dynamically return all properties of a model class?
[英]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.