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();
}
}
问问题
85 次
1 回答
3
这种遍历称为广度优先遍历:
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-2][N2-1]
第三个循环:
N1-2
从队列中删除的第一项:[N2-1]
- 添加到结果中的第一项:
(N0)(N1-1)(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-2][N2-3][N3-1]
所有这些项都没有子项,因此进一步的循环只会将它们从队列中一一删除并添加到结果中。
于 2013-09-17T09:47:31.973 回答