/// <summary> /// Performs a breadth first traversal on this tree with the specified visitor. /// </summary> /// <param name="visitor"> The visitor. </param> public void BreadthFirstTraversal(IVisitor <T> visitor) { var q = new VisitableQueue <GeneralTree <T> >(); q.Enqueue(this); while (!q.IsEmpty) { var t = q.Dequeue(); visitor.Visit(t.Data); for (var i = 0; i < t.Degree; i++) { var child = t.GetChild(i); if (child != null) { q.Enqueue(child); } } } }
/// <summary> /// Performs a breadth-first traversal from the specified vertex. /// </summary> /// <param name="visitor"> The visitor to use. </param> /// <param name="startVertex"> The vertex to start from. </param> public void BreadthFirstTraversal(IVisitor <Vertex <T> > visitor, Vertex <T> startVertex) { if (null == visitor) { throw new ArgumentNullException("visitor"); } if (null == startVertex) { throw new ArgumentNullException("startVertex"); } var visitedVertices = new List <Vertex <T> >(graphVertices.Count); var q = new VisitableQueue <Vertex <T> >(); q.Enqueue(startVertex); visitedVertices.Add(startVertex); while (!(q.IsEmpty || visitor.HasCompleted)) { var vertex = q.Dequeue(); visitor.Visit(vertex); var edges = vertex.EmanatingEdgeList; //foreach (var e in edges) //{ // var vertexToVisit = e.GetPartnerVertex(vertex); // if (!visitedVertices.Contains(vertexToVisit)) // { // q.Enqueue(vertexToVisit); // visitedVertices.Add(vertexToVisit); // } //} foreach (var vertexToVisit in Enumerable.Select(edges, e => e.GetPartnerVertex(vertex)).Where(vertexToVisit => !visitedVertices.Contains(vertexToVisit))) { q.Enqueue(vertexToVisit); visitedVertices.Add(vertexToVisit); } } }