diff --git a/bintree.c b/bintree.c index b194df7..59d0c46 100644 --- a/bintree.c +++ b/bintree.c @@ -56,7 +56,34 @@ TreeNode *addToTree(TreeNode *root, const void *data, size_t dataSize, CompareFc // push the top node and push all its left nodes. void *nextTreeData(TreeNode *root) { + /* Iterator state kept across calls (strtok-style). */ + static StackNode *iterStack = NULL; + /* Starting a new traversal: reset stack and seed with root's left spine. */ + if (root != NULL) { + clearStack(iterStack); + iterStack = NULL; + + for (TreeNode *n = root; n != NULL; n = n->left) { + iterStack = push(iterStack, n); + } + } + + /* No more elements. */ + if (iterStack == NULL) { + return NULL; + } + + /* Visit next node in-order. */ + TreeNode *node = (TreeNode *)top(iterStack); + iterStack = pop(iterStack); + + /* After visiting, push the left spine of the right subtree. */ + for (TreeNode *n = node->right; n != NULL; n = n->left) { + iterStack = push(iterStack, n); + } + + return node->data; } // Releases all memory resources (including data copies).