# 4.1. Route between nodes

> Given a directed graph and two nodes (S and E), is there a route from S to E?

A graph can be written like this:

```java
class Graph {
    public Node[] nodes;
}

class Node {
    public String name;
    public Node[] children;
}
```

The function to find a route from S to E:

```java
bool findRoute(Node S, Node E) {
    Node[] children = S.children;
    for (int i = 0; i < children.size(); i++){
        if (children[i] == E) {
            return True;
        }
        if (children[i].children == Null) {
            continue;
        }
        else if (findRoute(Node children[i].children, E)){
            return True;
        }
    }
    return False;
}
```

Example, Route from 5 to 11:

* 5
  * 2
    * 3
    * 4
  * 1
    * 9
    * 11
  * 6

1. children = [2, 1, 6]
   1. Recursive of 2, children = [3, 4]
   2. None of them have children, continue, return False
2. Back to main loop, continue with children
   1. recursive of 1, children = [9, 11]
   2. found in children[1] == E, return True
3. Back to main loop, return True

Looks good, O(N) where N = all elements in graph, well if the graph isn't balanced at all we might have to iterate through it all.

## Hints

Two well known algorithms can do this, what are the tradeoffs between them?

1. Depth-first search (mine)
   1. Check each node until the end
2. Breadth-first search
   1. Cheack each main children first, then go deep

## Solution

Remember to **mark the found nodes as visited to avoid cycles and repetitions of nodes**. 

For an iterative solution of breadh-first search, see Java files.

Depth-first search is a bit simpler to implement since it can be done with simple recursion. Breadth-first search can also be useful to find the shortest path, whereas depth-first search might traverse one adjacent node very deeply before ever going onto the immediate neighbors.
