Graph Traversal Text Weiss, § 9.6 Depth-First Search Think Stack Breadth-First Search Think Queue
Overview Goal –To systematically visit the nodes of a graph A tree is a directed, acyclic, graph (DAG) If the graph is a tree, –DFS is exhibited by preorder, postorder, and (for binary trees) inorder traversals –BFS is exhibited by level-order traversal
Depth-First Search // recursive, preorder, depth-first search void dfs (Node v) { if (v == null) return; if (v not yet visited) visit&mark(v); // visit node before adjacent nodes for (each w adjacent to v) if (w has not yet been visited) dfs(w); } // dfs
Depth-First Search // recursive, postorder, depth-first search void dfs (Node v) { if (v == null) return; tag(v); // mark v as having been considered for (each w adjacent to v) if (w has not yet been tagged) dfs(w); visit(v); // postorder traversal: visit node after // adjacent nodes } // dfs
Depth-First Search // non-recursive, preorder, depth-first search void dfs (Node v) { if (v == null) return; push(v); while (stack is not empty) { pop(v); if (v has not yet been visited) mark&visit(v); for (each w adjacent to v) if (w has not yet been visited) push(w); } // while } // dfs
Depth-First Search // non-recursive, postorder, depth-first search void dfs (Node v) { // Lex 20 (Do not need to submit) } // dfs
Example Policy: Visit adjacent nodes in increasing index order
Preorder DFS: Start with Node
Preorder DFS: Start with Node Push 5
Preorder DFS: Start with Node Pop/Visit/Mark 5
Preorder DFS: Start with Node Push 2, Push 1
Preorder DFS: Start with Node Pop/Visit/Mark 1
Preorder DFS: Start with Node Push 4, Push 2, Push 0
Preorder DFS: Start with Node Pop/Visit/Mark 0
Preorder DFS: Start with Node Push 7, Push 3
Preorder DFS: Start with Node Pop/Visit/Mark 3
Preorder DFS: Start with Node Push 2
Preorder DFS: Start with Node Pop/Mark/Visit 2
Preorder DFS: Start with Node Pop/Mark/Visit 7
Preorder DFS: Start with Node Push 6
Preorder DFS: Start with Node Pop/Mark/Visit 6
Preorder DFS: Start with Node Pop (don’t visit) 2
Preorder DFS: Start with Node Pop/Mark/Visit 4
Preorder DFS: Start with Node Pop (don’t visit) 2
Preorder DFS: Start with Node Done
Preorder DFS: Start with Node 5 Note: edge (0,3) removed
Depth-First Search Policy: Don’t push nodes twice // non-recursive, preorder, depth-first search void dfs (Node v) { if (v == null) return; push(v); while (stack is not empty) { pop(v); if (v has not yet been visited) mark&visit(v); for (each w adjacent to v) if (w has not yet been visited && not yet stacked) push(w); } // while } // dfs
Preorder DFS (Don’t push nodes twice). Start with Node
Postorder DFS: Start with Node
Breadth-first Search Ripples in a pond Visit designated node Then visited unvisited nodes a distance i away, where i = 1, 2, 3, etc. For nodes the same distance away, visit nodes in systematic manner (eg. increasing index order)
Breadth-First Search // non-recursive, preorder, breadth-first search void bfs (Node v) { if (v == null) return; enqueue(v); while (queue is not empty) { dequeue(v); if (v has not yet been visited) mark&visit(v); for (each w adjacent to v) if (w has not yet been visited && has not been queued) enqueue(w); } // while } // bfs
BFS: Start with Node
BFS: Start with Node
BFS: Node one-away
BFS: Visit 1 and
BFS: Nodes two-away
BFS: Visit 0 and
BFS: Nodes three-away
BFS: Visit nodes 3 and
BFS: Node four-away
BFS: Visit