Ejemplo n.º 1
0
        public WalkerResult DoDFS(INode node)
        {
            if (Graph.IsVisited(node, VisitorID))
            {
                return(WalkerResult.Proceed);
            }
            Graph.SetVisited(node, VisitorID, true);

            if (PreHandler != null)
            {
                WalkerResult preRes = PreHandler(node);
                if (preRes == WalkerResult.Abort)
                {
                    return(WalkerResult.Abort);
                }
                else if (preRes == WalkerResult.Skip)
                {
                    return(WalkerResult.Proceed);
                }

                // Return and proceed with parent, if current node has been deleted by pre handler
                if (!node.Valid)
                {
                    return(WalkerResult.Proceed);
                }
            }

            IEnumerable <IEdge> edgesToNext;

            if (Mode == WalkerMode.Outgoing)
            {
                edgesToNext = node.Outgoing;
            }
            else if (Mode == WalkerMode.Incoming)
            {
                edgesToNext = node.Incoming;
            }
            else if (Mode == WalkerMode.Incident)
            {
                edgesToNext = node.Incident;
            }
            else
            {
                throw new InvalidOperationException("Invalid walker mode!");
            }

            foreach (IEdge edge in edgesToNext)
            {
                INode next = edge.Opposite(node);

                WalkerResult res = DoDFS(next);
                if (res == WalkerResult.Abort)
                {
                    return(WalkerResult.Abort);
                }
                else if (res == WalkerResult.Skip)
                {
                    return(WalkerResult.Proceed);
                }

                // Return and proceed with parent, if current node has been deleted while walking children
                if (!node.Valid)
                {
                    return(WalkerResult.Proceed);
                }
            }

            if (PostHandler != null)
            {
                WalkerResult postRes = PostHandler(node);
                if (postRes == WalkerResult.Abort)
                {
                    return(WalkerResult.Abort);
                }
            }
            return(WalkerResult.Proceed);
        }
Ejemplo n.º 2
0
        public WalkerResult DoBFS(INode startNode)
        {
            LinkedList <INode> workList = new LinkedList <INode>();

            workList.AddLast(startNode);

            do
            {
                INode curNode = workList.First.Value;
                workList.RemoveFirst();

                if (Graph.IsVisited(curNode, VisitorID))
                {
                    continue;
                }
                Graph.SetVisited(curNode, VisitorID, true);

                if (Handler != null)
                {
                    WalkerResult preRes = Handler(curNode);
                    if (preRes == WalkerResult.Abort)
                    {
                        return(WalkerResult.Abort);
                    }
                    else if (preRes == WalkerResult.Skip)
                    {
                        continue;
                    }

                    // Proceed with next node, if current node has been deleted by handler
                    if (!curNode.Valid)
                    {
                        continue;
                    }
                }

                IEnumerable <IEdge> edgesToNext;
                if (Mode == WalkerMode.Outgoing)
                {
                    edgesToNext = curNode.Outgoing;
                }
                else if (Mode == WalkerMode.Incoming)
                {
                    edgesToNext = curNode.Incoming;
                }
                else if (Mode == WalkerMode.Incident)
                {
                    edgesToNext = curNode.Incident;
                }
                else
                {
                    throw new InvalidOperationException("Invalid walker mode!");
                }

                foreach (IEdge edge in edgesToNext)
                {
                    workList.AddLast(edge.Opposite(curNode));
                }
            }while(workList.Count != 0);

            return(WalkerResult.Proceed);
        }