Listing 5: Code for preorder iterator

// preorder iterator constructors and destructor
template <class DataType>
BinaryTreeIterator_PreOrder<DataType>::BinaryTreeIterator_PreOrder(
    const BinaryTreeIterator_PreOrder<DataType> &iter): 
    tree(iter.tree), stack(iter.stack)
{
}

BinaryTreeIterator_PreOrder<DataType>::BinaryTreeIterator_PreOrder(
    const BinaryTree<DataType> &bt): 
    tree(&bt), stack()
{
    reset();
}


template <class DataType>
BinaryTreeIterator_PreOrder<DataType>::
    ~BinaryTreeIterator_PreOrder()
{
}

// reset iterator to beginning
template <class DataType>
void BinaryTreeIterator_PreOrder<DataType>::reset()
{
    stack.clear();
    stack.push(tree->root);
    return;
}

// is list empty
template <class DataType>
int BinaryTreeIterator_PreOrder<DataType>::done() const
{
    return(stack.isEmpty());
}

// return current data
template <class DataType>
DataType BinaryTreeIterator_PreOrder<DataType>::operator()()
{
    BinaryTreeNode<DataType> *btn;
    MustBeTrue(stack.top(btn) == OK);
    return(btn->data);
}

// increment to next data item in list
template <class DataType>
int BinaryTreeIterator_PreOrder<DataType>::operator++(int)
{
    // is iterator done
    if (stack.isEmpty()) return(NOTOK);

    // get next node from stack
    BinaryTreeNode<DataType> *btn;
    MustBeTrue(stack.pop(btn) == OK);

    // stack left and right nodes, if any.
    if (btn->right != NULL)
        stack.push(btn->right);
    if (btn->left != NULL)
        stack.push(btn->left);
    return(OK);
}
/* End of File */