Exemple #1
0
        /// <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);
                    }
                }
            }
        }
Exemple #2
0
        /// <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);
                }
            }
        }