Tree Traversals A traversal is a way of walking the tree structure Some common traversals: –pre-order traversal –in-order traversal –post-order traversal
(Depth-first) traversal path Fred WilmaBetty Barney Pebbles
Each node is reached three times Fred WilmaBetty Barney Pebbles
Pre-order traversal (1) visit node before children Fred WilmaBetty Barney Pebbles Fred Betty Barney Wilma Pebbles
In-order traversal (2) visit node between children Fred WilmaBetty Barney Pebbles Barney Betty Fred Pebbles Wilma
Post-order traversal (3) visit node after children Fred WilmaBetty Barney Pebbles Barney Betty Pebbles Wilma Fred
Example Fred WilmaBetty Barney Pebbles Pre-order traversal: Fred Betty Barney Wilma Pebbles In-order traversal: Barney Betty Fred Pebbles Wilma Post-order traversal: Barney Betty Pebbles Wilma Fred
Tree iterators We can define tree iterators which follow the same traversal path. Unlike the visitors, iterators stop at each node: they must remember where they are! Let us consider first an in-order iterator.
Behavior of an inOrderIterator > java.util.Iterator it = bst.inOrderIterator(); > System.out.println("it.hasNext() ==> "+it.hasNext()); it.hasNext() ==> true Fred WilmaBetty Barney Pebbles
Behavior of an inOrderIterator > java.util.Iterator it = bst.inOrderIterator(); > System.out.println("it.hasNext() ==> "+it.hasNext()); it.hasNext() ==> true > System.out.println("it.next() ==> " + it.next()); it.next() ==> Barney > System.out.println("it.hasNext() ==> "+it.hasNext()); it.hasNext() ==> true Fred WilmaBetty Barney Pebbles
Behavior of an inOrderIterator > java.util.Iterator it = bst.inOrderIterator(); > System.out.println("it.hasNext() ==> "+it.hasNext()); it.hasNext() ==> true > System.out.println("it.next() ==> " + it.next()); it.next() ==> Barney > System.out.println("it.hasNext() ==> "+it.hasNext()); it.hasNext() ==> true > System.out.println("it.next() ==> " + it.next()); it.next() ==> Betty > System.out.println("it.hasNext() ==> "+it.hasNext()); it.hasNext() ==> true Fred WilmaBetty Barney Pebbles
Behavior of an inOrderIterator > java.util.Iterator it = bst.inOrderIterator(); > System.out.println("it.hasNext() ==> "+it.hasNext()); it.hasNext() ==> true > System.out.println("it.next() ==> " + it.next()); it.next() ==> Barney > System.out.println("it.hasNext() ==> "+it.hasNext()); it.hasNext() ==> true > System.out.println("it.next() ==> " + it.next()); it.next() ==> Betty > System.out.println("it.hasNext() ==> "+it.hasNext()); it.hasNext() ==> true > System.out.println("it.next() ==> " + it.next()); it.next() ==> Fred > System.out.println("it.hasNext() ==> "+it.hasNext()); it.hasNext() ==> true Fred WilmaBetty Barney Pebbles
Behavior of an inOrderIterator > java.util.Iterator it = bst.inOrderIterator(); > System.out.println("it.hasNext() ==> "+it.hasNext()); it.hasNext() ==> true > System.out.println("it.next() ==> " + it.next()); it.next() ==> Barney > System.out.println("it.hasNext() ==> "+it.hasNext()); it.hasNext() ==> true > System.out.println("it.next() ==> " + it.next()); it.next() ==> Betty > System.out.println("it.hasNext() ==> "+it.hasNext()); it.hasNext() ==> true > System.out.println("it.next() ==> " + it.next()); it.next() ==> Fred > System.out.println("it.hasNext() ==> "+it.hasNext()); it.hasNext() ==> true > System.out.println("it.next() ==> " + it.next()); it.next() ==> Pebbles > System.out.println("it.hasNext() ==> "+it.hasNext()); it.hasNext() ==> true Fred WilmaBetty Barney Pebbles
Behavior of an inOrderIterator > java.util.Iterator it = bst.inOrderIterator(); > System.out.println("it.hasNext() ==> "+it.hasNext()); it.hasNext() ==> true > System.out.println("it.next() ==> " + it.next()); it.next() ==> Barney > System.out.println("it.hasNext() ==> "+it.hasNext()); it.hasNext() ==> true > System.out.println("it.next() ==> " + it.next()); it.next() ==> Betty > System.out.println("it.hasNext() ==> "+it.hasNext()); it.hasNext() ==> true > System.out.println("it.next() ==> " + it.next()); it.next() ==> Fred > System.out.println("it.hasNext() ==> "+it.hasNext()); it.hasNext() ==> true > System.out.println("it.next() ==> " + it.next()); it.next() ==> Pebbles > System.out.println("it.hasNext() ==> "+it.hasNext()); it.hasNext() ==> true > System.out.println("it.next() ==> " + it.next()); it.next() ==> Wilma > System.out.println("it.hasNext() ==> "+it.hasNext()); it.hasNext() ==> false Fred WilmaBetty Barney Pebbles
Implementation? How is state of iterator maintained?
Implementation: Using a stack! On creation of the iterator, references to all nonEmpty trees along the left edge of the tree are pushed onto the stack hasNext() is implemented to return !_stack.isEmpty()
Behavior of an inOrderIterator > java.util.Iterator it = bst.inOrderIterator(); > System.out.println("it.hasNext() ==> "+it.hasNext()); it.hasNext() ==> true Fred WilmaBetty Barney Pebbles
Implementation: The next() method pops an item off the stack, walks down its right child’s left edge (pushing BRS references onto the stack along the way)
Behavior of an inOrderIterator > java.util.Iterator it = bst.inOrderIterator(); > System.out.println("it.hasNext() ==> "+it.hasNext()); it.hasNext() ==> true > System.out.println("it.next() ==> " + it.next()); it.next() ==> Barney > System.out.println("it.hasNext() ==> "+it.hasNext()); it.hasNext() ==> true Fred WilmaBetty Barney Pebbles
Behavior of an inOrderIterator > java.util.Iterator it = bst.inOrderIterator(); > System.out.println("it.hasNext() ==> "+it.hasNext()); it.hasNext() ==> true > System.out.println("it.next() ==> " + it.next()); it.next() ==> Barney > System.out.println("it.hasNext() ==> "+it.hasNext()); it.hasNext() ==> true > System.out.println("it.next() ==> " + it.next()); it.next() ==> Betty > System.out.println("it.hasNext() ==> "+it.hasNext()); it.hasNext() ==> true Fred WilmaBetty Barney Pebbles
Behavior of an inOrderIterator > java.util.Iterator it = bst.inOrderIterator(); > System.out.println("it.hasNext() ==> "+it.hasNext()); it.hasNext() ==> true > System.out.println("it.next() ==> " + it.next()); it.next() ==> Barney > System.out.println("it.hasNext() ==> "+it.hasNext()); it.hasNext() ==> true > System.out.println("it.next() ==> " + it.next()); it.next() ==> Betty > System.out.println("it.hasNext() ==> "+it.hasNext()); it.hasNext() ==> true > System.out.println("it.next() ==> " + it.next()); it.next() ==> Fred > System.out.println("it.hasNext() ==> "+it.hasNext()); it.hasNext() ==> true Fred WilmaBetty Barney Pebbles
Behavior of an inOrderIterator > java.util.Iterator it = bst.inOrderIterator(); > System.out.println("it.hasNext() ==> "+it.hasNext()); it.hasNext() ==> true > System.out.println("it.next() ==> " + it.next()); it.next() ==> Barney > System.out.println("it.hasNext() ==> "+it.hasNext()); it.hasNext() ==> true > System.out.println("it.next() ==> " + it.next()); it.next() ==> Betty > System.out.println("it.hasNext() ==> "+it.hasNext()); it.hasNext() ==> true > System.out.println("it.next() ==> " + it.next()); it.next() ==> Fred > System.out.println("it.hasNext() ==> "+it.hasNext()); it.hasNext() ==> true > System.out.println("it.next() ==> " + it.next()); it.next() ==> Pebbles > System.out.println("it.hasNext() ==> "+it.hasNext()); it.hasNext() ==> true Fred WilmaBetty Barney Pebbles
Behavior of an inOrderIterator > java.util.Iterator it = bst.inOrderIterator(); > System.out.println("it.hasNext() ==> "+it.hasNext()); it.hasNext() ==> true > System.out.println("it.next() ==> " + it.next()); it.next() ==> Barney > System.out.println("it.hasNext() ==> "+it.hasNext()); it.hasNext() ==> true > System.out.println("it.next() ==> " + it.next()); it.next() ==> Betty > System.out.println("it.hasNext() ==> "+it.hasNext()); it.hasNext() ==> true > System.out.println("it.next() ==> " + it.next()); it.next() ==> Fred > System.out.println("it.hasNext() ==> "+it.hasNext()); it.hasNext() ==> true > System.out.println("it.next() ==> " + it.next()); it.next() ==> Pebbles > System.out.println("it.hasNext() ==> "+it.hasNext()); it.hasNext() ==> true > System.out.println("it.next() ==> " + it.next()); it.next() ==> Wilma > System.out.println("it.hasNext() ==> "+it.hasNext()); it.hasNext() ==> false Fred WilmaBetty Barney Pebbles