CSC 103 Lecture Notes Week 4
More on Trees, Particularly Traversal
public String traversePreorder(BinaryTreeNode t) {
if (t == null) return "";
return t.value.toString() + " " +
traversePreorder(t.left) +
traversePreorder(t.right);
}
public String traverseWithNestedLoop() {
String result = ""; // Return result
BinaryTreeNode nodeI, nodeJ; // Traversal nodes
/*
* Traverse the tree with an outer loop that visits to the left and an
* inner loop that visits to the right.
*/
for (nodeI = root; nodeI != null; nodeI = nodeI.left) {
for (nodeJ = nodeI; nodeJ != null; nodeJ = nodeJ.right) {
result = result + nodeJ.value.toString() + " ";
}
}
return result;
}
public String traverseWithStack() {
String result = ""; // Return result
BinaryTreeNode current; // Current node of traversal
boolean done = false; // Termination condition
/*
* Start the traversal at the root of the tree.
*/
current = root;
/*
* Traverse the tree by going off to the left, while saving right
* subtrees on a stack. The stack gets checked when we run off the
* left end. The traversal continues while there are left nodes to
* visit, and the right-node stack is not empty.
*/
while (!done) {
/*
* If the current node being visited is not null, visit its value
* by concatenating it onto the output result. Push the right
* subtree onto the stack, thereby saving it until we're done going
* left. Then make current the left subtree and continue the
* traversal.
*/
if (current != null) {
result = result + current.value.toString() + " ";
push(current.right);
current = current.left;
}
/*
* If the current node is null, then check the stack of postponed
* right subtrees. If the stack is empty, we're done with the
* traversal. Otherwise, pop the stack into the current node and
* continue the traversal.
*/
else {
if (emptyStack()) {
done = true;
}
else {
current = pop();
}
}
}
return result;
}