/* Copyright (c) 2006, Sriram Srinivasan
*
* You may distribute this software under the terms of the license
* specified in the file "License"
*/
package kilim.examples;
import kilim.Generator;
import kilim.Pausable;
/**
* This example illustrates two 'generators' that walk a tree, one in pre-order
* and another in post-order.
*
* A generator is an iterator that generates a value (in this
* case the nodes of the tree) each time its execute() method
* 'yields' a value.
*
* Also, @see kilim.examples.Fib
*/
public class Tree {
public String _val;
Tree _left;
Tree _right;
public static void main(String[] args) {
Tree t = new Tree("root",
new Tree("a",
new Tree("a1"),
new Tree("a2")),
new Tree("b",
new Tree ("b1"),
new Tree ("b2")));
System.out.println("Pre-order traversal:");
for (String s: new Pre(t)) {
System.out.println(s);
}
System.out.println("Post-order traversal");
for (String s: new Post(t)) {
System.out.println(s);
}
}
Tree(String s) {_val = s;}
Tree(String s, Tree l, Tree r) {this(s); _left = l; _right = r;}
}
class Pre extends Generator<String> {
Tree _t;
Pre(Tree t) {_t = t;}
public void execute() throws Pausable{
walk(_t);
}
void walk(Tree t) throws Pausable {
if (t == null) return;
yield(t._val);
walk(t._left);
walk(t._right);
}
}
class Post extends Generator<String> {
Tree _t;
Post(Tree t) {_t = t;}
public void execute() throws Pausable {
walk(_t);
}
void walk(Tree t) throws Pausable {
if (t == null) return;
walk(t._left);
walk(t._right);
yield(t._val);
}
}