Like trees there are 2 types of traversals, Breadth-first traversal and Depth-first traversal.
Breadth-first traversals will go thru each node in the current level before going into the next level.
Depth-first traversal will go thru the node till it reaches the end before going to the next node.
  (They are directed graph pointing all downwards 😜)
        1
      /   \
     2     3
      \   /
        4
    -> If we start our traversals from 1, then depth-first traversal output would be
      [1,2,4,3] or [1,3,4,2].
    -> In these traversals we need to specify which node we want to start traversing from,
       Since in graphs there is no root unlike trees.
    -> For Breadth-first traversal, our output will be,
        [1,2,3,4] or [1,3,2,4]
    -> We look at all nodes in the level before going into the next level
Now that you have a brief understanding, lets look at the code for it.
lets stat with breadth first traversal, its similar to what we have seen in trees.
  /*
   * Time: O(V^2), with hashSet O(V)
   * Space: O(V)
   */
  public void breadthFirst(String label) {
    Node labelNode = findNode(label);
    if (labelNode == null)
      return;
    // We need to keep track of all visited vertices to
    // this leads to a O(V) space complexity
    List<Node> visited = new LinkedList<Node>();
    Queue<Node> queue = new LinkedList<Node>();
    queue.add(labelNode);
    visited.add(labelNode);
    while (!queue.isEmpty()) {
      Node node = queue.poll();
      System.out.print(node + " ");
      for (Node child : node.edges) {
        // In graphs we need to make sure that we didn't visit the node
        // if we did, we won't add the node into the queue.
        // If you do add the node into the queue, we will end up in an infinity loop 😣
        if (visited.contains(child))
          continue;
          queue.add(child);
          visited.add(child);
      }
    }
  }
Now for DFS, lets look at the algorithm:
  /*
   * Time: O(V^2), with hashSet O(V)
   * Space: O(V)
   */
  public void depthFirst(String label) {
    Node labelNode = findNode(label);
    if (labelNode == null)
      return;
    List<Node> visited = new LinkedList<Node>();
    Stack<Node> stack = new Stack<Node>();
    stack.add(labelNode);
    visited.add(labelNode);
    while (!stack.isEmpty()) {
      Node node = stack.pop();
      System.out.print(node + " ");
      for (Node child : node.edges) {
        if (!visited.contains(child)) {
          stack.push(child);
          visited.add(child);
        }
      }
    }
  }
DFS can also be done using recursion but I felt like the stack approach felt easier to start off with.
This Project is Open sourced!!, visit our github to contribute