package com.jadekler.datastructures; import java.util.Stack; import java.util.Queue; import java.util.LinkedList; /** * This class holds items in a binary tree fashion, without balancing * Please note: ideas for this implementation influenced by Skiena's 'The Algorithm Design Manual' */ public class Graph { public int[][] adjacencyList; public static void main(String args[]) { int[][] adjacencyList = {{1,2},{4},{2},{4},{0}}; Graph graph = new Graph(adjacencyList); graph.bfs(4); graph.dfs(4); } public Graph(int[][] adjacencyList) { this.adjacencyList = adjacencyList; } public void bfs(int numToFind) { System.out.println("Breadth first search"); Queue queue = new LinkedList(); boolean[] discovered = new boolean[this.adjacencyList.length]; for (int i = 0; i < discovered.length; i++) { discovered[i] = false; } queue.offer(0); discovered[0] = true; this.bfs(queue,discovered,numToFind); } public void bfs(Queue queue, boolean[] discovered, int numToFind) { while (!queue.isEmpty()) { int curNum = (int)queue.poll(); System.out.println("At: "+curNum); if (curNum == numToFind) { System.out.println("Found "+curNum+"!"); return; } for (int i = 0; i < this.adjacencyList[curNum].length; i++) { int adjacentNum = this.adjacencyList[curNum][i]; if (!discovered[adjacentNum]) { queue.offer(adjacentNum); discovered[adjacentNum] = true; } } } } public void dfs(int numToFind) { System.out.println("Depth first search"); Stack stack = new Stack(); boolean[] discovered = new boolean[this.adjacencyList.length]; for (int i = 0; i < discovered.length; i++) { discovered[i] = false; } stack.push(0); discovered[0] = true; this.dfs(stack,discovered,numToFind); } public void dfs(Stack stack, boolean[] discovered, int numToFind) { while (!stack.isEmpty()) { int curNum = (int)stack.pop(); System.out.println("At: "+curNum); if (curNum == numToFind) { System.out.println("Found "+curNum+"!"); return; } for (int i = 0; i < this.adjacencyList[curNum].length; i++) { int adjacentNum = this.adjacencyList[curNum][i]; if (!discovered[adjacentNum]) { stack.push(adjacentNum); discovered[adjacentNum] = true; } } } } }