Title: Tree Traversals
1Tree Traversals
- A traversal is a way of walking the tree
structure - Some common traversals
- pre-order traversal
- in-order traversal
- post-order traversal
2(Depth-first) traversal path
3Each node is reached three times
1
3
2
1
1
3
3
2
2
1
1
3
3
2
2
4Pre-order traversal (1)visit node before children
1
1
1
1
1
Fred ? Betty ? Barney ? Wilma ? Pebbles
5In-order traversal (2)visit node between children
2
2
2
2
2
Barney ? Betty ? Fred ? Pebbles ? Wilma
6Post-order traversal (3)visit node after children
3
3
3
3
3
Barney ? Betty ? Pebbles ? Wilma ? Fred
7Example
Pre-order traversal Fred Betty Barney Wilma
Pebbles
Fred
In-order traversal Barney Betty Fred Pebbles
Wilma
Wilma
Betty
Post-order traversal Barney Betty Pebbles Wilma
Fred
Barney
Pebbles
8Tree 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.
9Behavior of an inOrderIterator
- java.util.Iterator it bst.inOrderIterator()
- System.out.println("it.hasNext()
"it.hasNext()) - it.hasNext() true
10Behavior 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
11Behavior 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
12Behavior 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
13Behavior 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
14Behavior 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
15Implementation?
- How is state of iterator maintained?
16Implementation
- 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()
17Behavior of an inOrderIterator
- java.util.Iterator it bst.inOrderIterator()
- System.out.println("it.hasNext()
"it.hasNext()) - it.hasNext() true
18Implementation
- The next() method pops an item off the stack,
walks down its right childs left edge (pushing
BRS references onto the stack along the way)
19Behavior 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
20Behavior 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
21Behavior 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
22Behavior 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
23Behavior 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