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