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); }
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); }