Traversals A systematic method to visit all nodes in a tree Binary tree traversals: Pre-order: root,...
-
Upload
gregory-mcbride -
Category
Documents
-
view
212 -
download
0
Transcript of Traversals A systematic method to visit all nodes in a tree Binary tree traversals: Pre-order: root,...
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)
5
2
1 3
8
6 10
7 9
Pre-order (Prefix)
5 2 1 3 8 6 7 10 9
5
2
1 3
8
6 10
7 9
Post-order (Postfix)
1 3 2 7 6 9 10 8 5
5
2
1 3
8
6 10
7 9
Post-order
1 3 * + 6 10 -
+
*
1 3
-
6 10
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
5
2
1 3
8
6 10
7 95 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
5
2
1 3
8
6 10
7 95 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 Graphsourcevertex
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
3 8
1 4 10
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 Sample AVL code