I'm trying to implement a depth first search algorithm in Java. Any idea why this method is going into an infinite loop? Thanks.
public Node search(Graph graph, String nodeName, int ID) {
//Get the root node
Node root = graph.getRoot();
Stack<Node> stack = new Stack<Node>();
//Add the root to the stack
stack.push(root);
while(!stack.isEmpty())
{
Node n = stack.pop();
//Check to see if node n is the requested node
if(n.getName().equals(nodeName))
{
//Found
return n;
}else
{
//Create an array of the leaf nodes to node n
Node[] children = n.getNeighbours();
for(int i =0; i<children.length; i++)
{
//Add the leaf nodes to the stack
stack.push(children[i]);
System.out.println(stack.peek());
}
}
}
//Not found so return null
return null;
}
If you graph has cycles (or is undirected), you must "mark" the nodes after you visit them, otherwise you will keep coming back to them.
Unless your graph is a tree, it will have cycles. A node can be its own grandchild. You need to prevent nodes you've already visited from being added to the search tree.
A simple way to do this is through another data structure:
Set<Node> visitedNodes = new HashSet<Node>();
//...
if ( !visitedNodes.contains(children[i]) ) {
stack.push(children[i]);
visitedNodes.add(children[i]);
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With