AuD
Lecture 'Algorithmen und Datenstrukturen' (code examples)
BinaryTreeTraversal.java
Go to the documentation of this file.
1package aud;
2
3import java.util.Iterator;
4
14public class BinaryTreeTraversal<T> {
15
19 public abstract class Traversal
20 implements Iterable<BinaryTree<T> > {
21 BinaryTree<T> tree_;
22
23 Traversal(BinaryTree<T> tree) { tree_=tree; }
24
25 @Override public String toString() {
26 String s="";
27 for (BinaryTree<T> node : this) {
28 s+=node.getData().toString()+",";
29 }
30 return s.substring(0,s.length()-1);
31 }
32 }
33
35 public abstract class RecursiveTraversalIterator
36 implements Iterator<BinaryTree<T> > {
37
39
41 stack_.push(tree);
42 }
43
44 @Override public boolean hasNext() {
45 return !stack_.is_empty();
46 }
48 @Override public void remove() {
49 throw new UnsupportedOperationException();
50 }
51 }
52
54 public class PreorderIterator
56 PreorderIterator(BinaryTree<T> tree) { super(tree); }
57
58 @Override public BinaryTree<T> next() {
59 BinaryTree<T> node=stack_.pop(); // may throw!
60 if (node.getRight()!=null) stack_.push(node.getRight());
61 if (node.getLeft()!=null) stack_.push(node.getLeft());
62 return node;
63 }
64 }
65
67 public class Preorder
68 extends Traversal implements Iterable<BinaryTree<T> > {
69 Preorder(BinaryTree<T> tree) { super(tree); }
70 @Override public Iterator<BinaryTree<T> > iterator() {
71 return new PreorderIterator(tree_);
72 }
73 }
78 return new Preorder(tree);
79 }
80
81
83 public class InorderIterator
86 super(tree);
87 descendLeft();
88 }
89
90 private void descendLeft() {
91 BinaryTree<T> node=stack_.top();
92 for (node=node.getLeft();node!=null;node=node.getLeft())
93 stack_.push(node);
94 }
95
96 @Override public BinaryTree<T> next() {
97 BinaryTree<T> node=stack_.pop();
98 if (node.getRight()!=null) {
99 stack_.push(node.getRight());
100 descendLeft();
101 }
102
103 return node;
104 }
105 }
106
108 public class Inorder
109 extends Traversal implements Iterable<BinaryTree<T> >{
110 Inorder(BinaryTree<T> tree) { super(tree); }
111 @Override public Iterator<BinaryTree<T> > iterator() {
112 return new InorderIterator(tree_);
113 }
114 }
115
120 return new Inorder(tree);
121 }
122
123
125 public class PostorderIterator
127 final static int LEFT=0;
128 final static int RIGHT=1;
129 final static int OUTPUT=2;
130
131 /* Idea:
132
133 We keep a second stack (of same size), which keeps track of the
134 current state. Note: One single stack would be enough, but
135 then we would have to worry about types (node or state).
136
137 The state tells us, "where we are". Have alook at the recursive
138 version. Then the state is defined as follows
139
140 visit(node)
141 // state == LEFT
142 visit(node.left)
143 // state == RIGHT
144 visit(node.right)
145 // state == OUTPUT
146 output(node)
147 */
148
149 Stack<Integer> state_ = new Stack<Integer>();
150
152 super(tree);
153 state_.push(LEFT);
154 }
155
156 private void descendLeft() {
157 BinaryTree<T> node=stack_.top();
158 for (node=node.getLeft();node!=null;node=node.getLeft()) {
159 stack_.push(node);
160 state_.push(RIGHT);
161 }
162 }
163
164 @Override public boolean hasNext() {
165 assert(stack_.is_empty()==state_.is_empty()); // additional check
166 return super.hasNext();
167 }
168
169 @Override public BinaryTree<T> next() {
170 int state;
171 while ((state=state_.pop())!=OUTPUT) {
172 if (state==LEFT) {
173 // stack_.top() remains
174 state_.push(RIGHT);
175
176 descendLeft();
177 }
178 else {
179 // stack_.top() remains
180 state_.push(OUTPUT);
181
182 BinaryTree<T> node=stack_.top();
183 if (node.getRight()!=null) {
184 stack_.push(node.getRight());
185 state_.push(LEFT);
186 }
187 }
188 }
189 return stack_.pop(); // state == OUTPUT
190 }
191 }
192
194 public class Postorder
195 extends Traversal implements Iterable<BinaryTree<T> > {
196 Postorder(BinaryTree<T> tree) { super(tree); }
197 @Override public Iterator<BinaryTree<T> > iterator() {
198 return new PostorderIterator(tree_);
199 }
200 }
201
206 return new Postorder(tree);
207 }
208
209
211 public class LevelorderIterator implements Iterator<BinaryTree<T> > {
212
213 Queue<BinaryTree<T> > queue_ = new Queue<BinaryTree<T> >();
214
216 queue_.enqueue(tree);
217 }
218
219 @Override public boolean hasNext() {
220 return !queue_.is_empty();
221 }
223 @Override public void remove() {
224 throw new UnsupportedOperationException();
225 }
226
227 @Override public BinaryTree<T> next() {
228 BinaryTree<T> node=queue_.dequeue(); // may throw!
229 if (node.getLeft()!=null) queue_.enqueue(node.getLeft());
230 if (node.getRight()!=null) queue_.enqueue(node.getRight());
231 return node;
232 }
233 }
234
236 public class Levelorder
237 extends Traversal implements Iterable<BinaryTree<T> > {
238 Levelorder(BinaryTree<T> tree) { super(tree); }
239 @Override public Iterator<BinaryTree<T> > iterator() {
240 return new LevelorderIterator(tree_);
241 }
242 }
247 return new Levelorder(tree);
248 }
249
250}
helper: generates InorderIterator
Iterator< BinaryTree< T > > iterator()
level-order iterator for BinaryTree
helper: generates LevelorderIterator
Iterator< BinaryTree< T > > iterator()
helper: generates PostorderIterator
Iterator< BinaryTree< T > > iterator()
helper: generates PreorderIterator
Iterator< BinaryTree< T > > iterator()
base class for stack-based pre-/in-/postorder traversal
Provide traversals of binary trees.
Postorder postorder(BinaryTree< T > tree)
return instance of generator
Preorder preorder(BinaryTree< T > tree)
return instance of generator
Inorder inorder(BinaryTree< T > tree)
return instance of generator
Levelorder levelorder(BinaryTree< T > tree)
return instance of generator
Simple binary tree.
Definition: BinaryTree.java:26
BinaryTree< T > getLeft()
get left child or null
Definition: BinaryTree.java:86
T getData()
get node data
Definition: BinaryTree.java:81
BinaryTree< T > getRight()
get right child or null)
Definition: BinaryTree.java:88
Implementation of AbstractQueue as a (dynamically resized) circular buffer based on array.
Definition: Queue.java:11
void enqueue(T x)
Enqueue element at end of queue.
Definition: Queue.java:62
boolean is_empty()
Is queue empty?
Definition: Queue.java:35
T dequeue()
Remove front element from queue.
Definition: Queue.java:50
Implementation of a stack based on aud.Vector.
Definition: Stack.java:8
void push(T x)
Push x onto stack.
Definition: Stack.java:31
boolean is_empty()
Is stack empty?
Definition: Stack.java:14
T pop()
Pop element from stack.
Definition: Stack.java:23