# Traversals A systematic method to visit all nodes in a tree Binary tree traversals: Pre-order: root, left, right In-order: left, root, right Post-order:

## Presentation on theme: "Traversals A systematic method to visit all nodes in a tree Binary tree traversals: Pre-order: root, left, right In-order: left, root, right Post-order:"— Presentation transcript:

Traversals A systematic method to visit all nodes in a tree Binary tree traversals: Pre-order: root, left, right In-order: left, root, right Post-order: left, right, root General graph traversals (searches) Depth-first search Breadth-first search

Inorder(tree t) 1. if t = nil 2. return 3. inorder(t.left) 4. visit(t) // e.g., print it 5. inorder(t.right)

Inorder (Infix) 1 2 3 5 6 7 8 9 10 (a BST will always work well with in-order traversal) 5213861079

Pre-order (Prefix) 5 2 1 3 8 6 7 10 9 5213861079

Post-order (Postfix) 1 3 2 7 6 9 10 8 5 5213861079

Post-order 1 3 * + 6 10 - +*13-610

Depth-first search (DFS) חיפוש לעומק)) DFS: Search one subtree completely before other Pre-order traversal is an example of a DFS: Visit root, left subtree (all the way), visit right subtree We can do it in other order: Visit root, right subtree, left subtree

Depth-first search (DFS) DFS: visit all descendents before siblings 5213861079 5 2 1 3 8 6 7 10 9

DFS(tree t) 1. q  new stack 2. push(q, t) 3. while (not empty(q)) 4. curr  pop(q) 5. visit curr // e.g., print curr.datum 6. push(q, curr.left) 7. push(q, curr.right) This version for binary trees only!

Breadth-first search (BFS) (חיפוש לרוחב) BFS: visit all siblings before their descendents 5213861079 5 2 8 1 3 6 10 7 9

BFS(tree t) 1. q  new queue 2. enqueue(q, t) 3. while (not empty(q)) 4. curr  dequeue(q) 5. visit curr // e.g., print curr.datum 6. enqueue(q, curr.left) 7. enqueue(q, curr.right) This version for binary trees only!

DFS(tree t) 1. q  new stack 2. push(q, t) 3. while (not empty(q)) 4. curr  pop(q) 5. visit curr // e.g., print curr.datum 6. push(q, curr.left) 7. push(q, curr.right) This version for binary trees only!

DFS(tree t) Void Graph::dfs (Vertex v) { v.visted = true; for each w adjacent to v if (!w.visited) dfs(w); } This version for any type of trees (graph)

Graphs vs. Trees  Graphs don’t have any root  Graphs can be directed or undirected  Trees only grow down (upside-down)  (Why do trees grow upside down for Computer scientists???)  Graphs can have cycles, trees can’t (why?)

DFS Example on Graph source vertex

AVL (Adelson, Velskii, Landis)  Balance the tree (not our targil)  The left and right branches of the tree can only differ by one level  Ensures log N depth (much better for searching)  Takes log N to add or delete

5 38 1 410 5 3 1 4 AVL Tree Not AVL Tree

AVL Trees  Trees often need to be “rotated” when deleting or inserting to keep AVL balance  Nice link on this process Nice link on this process  Sample AVL code Sample AVL code

Download ppt "Traversals A systematic method to visit all nodes in a tree Binary tree traversals: Pre-order: root, left, right In-order: left, root, right Post-order:"

Similar presentations