/***********************************************************************/ /* file bst_iter.cc */ /* contains the implementation of class members of class */ /* bst_iter. */ /***********************************************************************/ #include "bst_iter.h" /***********************************************************************/ /* implementation of class bst_iter */ /***********************************************************************/ /***********************************************************************/ /* constructor */ /***********************************************************************/ template <class type> bst_iterator<type>::bst_iterator(const base_bst<type> *tree): cont_iterator<type>(tree) { assert(tree != NULL); c= tree; init(); } /***********************************************************************/ /* copy constructor */ /* only attaches the iterator to the same tree but initializes it to */ /* to the first position in the tree. */ /***********************************************************************/ template <class type> bst_iterator<type>::bst_iterator(const bst_iterator<type>& bst_iter): cont_iterator<type>(bst_iter) { c= bst_iter.c; stk= bst_iter.stk; cursor= bst_iter.cursor; } /***********************************************************************/ /* public member operator= */ /* copies all values from the passed bst_iterator including the */ /* complete stack and current position. */ /***********************************************************************/ template <class type> const bst_iterator<type>& bst_iterator<type>::operator= (const bst_iterator<type>& bst_iter) { c= bst_iter.c; stk= bst_iter.stk; cursor= bst_iter.cursor; return *this; } /***********************************************************************/ /* public member function init */ /* takes no arguments and initializes the iterator. it sets the cursor */ /* to the leftmost node in the tree and saves the parent nodes on the */ /* stack stk. Cursor points beyond the leftmost node to the left (i.e. */ /* is NULL) such that one step() is necessary prior to use of */ /* member function current() or c_value(). */ /***********************************************************************/ template <class type> void bst_iterator<type>::init() { stk.clear(); cursor= c->head; while(cursor) { stk.push(cursor); cursor= cursor->left; } } /***********************************************************************/ /* public member function step */ /* moves one node further in an inorder traversal of the tree c. */ /* It returns 0 if the traversal was already completed, 1 otherwise. */ /***********************************************************************/ template <class type> int bst_iterator<type>::step() { if (cursor) { if (cursor->right) { cursor= cursor->right; while(cursor) { stk.push(cursor); cursor= cursor->left; } } } if (stk.empty()) { return 0; } else { cursor= stk.pop(); return 1; } } /***********************************************************************/ /* public member function current */ /* returns a pointer to the current item in the bst, i.e. the item */ /* the cursor currently points to. */ /***********************************************************************/ template <class type> bst_item<type> *bst_iterator<type>::current() { return cursor; } /***********************************************************************/ /* public member function c_value */ /* returns the value of the current item in the bst, i.e. the value of */ /* the item the cursor currently points to. If cursor points to NULL, */ /* 0 is returned (type needs to have some 0 element). */ /***********************************************************************/ template <class type> type bst_iterator<type>::c_value() { assert(cursor != NULL); return cursor->data; }