aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tree.c36
1 files changed, 34 insertions, 2 deletions
diff --git a/tree.c b/tree.c
index b2515ca..9dc9cb9 100644
--- a/tree.c
+++ b/tree.c
@@ -554,6 +554,38 @@ tree_iterator_free(struct tree_iterator *it)
554 stack_free(&it->stack); 554 stack_free(&it->stack);
555} 555}
556 556
557struct tree_node *
558tree_preorder_iterator_next(struct tree_iterator *it)
559{
560 struct tree_node *node = NULL;
561
562 if ( stack_pop(&it->stack, &node) ) {
563 if ( node->right != NULL ) {
564 stack_push(&it->stack, node->right);
565 }
566 if ( node->left != NULL ) {
567 stack_push(&it->stack, node->left);
568 }
569 }
570
571 return node;
572}
573
574struct tree_node *
575tree_preorder_iterator_first(struct tree_iterator *it, struct tree_node *tree)
576{
577 stack_init(&it->stack);
578
579 if ( tree ) {
580 stack_push(&it->stack, tree);
581
582 return tree_preorder_iterator_next(it);
583 }
584 else {
585 return NULL;
586 }
587}
588
557/* ===== */ 589/* ===== */
558 590
559void 591void
@@ -656,11 +688,11 @@ main(void)
656 show_tree(tree, 0, 0); 688 show_tree(tree, 0, 0);
657 689
658 struct tree_iterator it; 690 struct tree_iterator it;
659 struct tree_node * node = tree_iterator_first(&it, tree); 691 struct tree_node * node = tree_preorder_iterator_first(&it, tree);
660 while ( node ) { 692 while ( node ) {
661 fprintf(stdout, "%d\n", node->key); 693 fprintf(stdout, "%d\n", node->key);
662 694
663 node = tree_iterator_next(&it); 695 node = tree_preorder_iterator_next(&it);
664 } 696 }
665 tree_iterator_free(&it); 697 tree_iterator_free(&it);
666 698