diff options
Diffstat (limited to 'tree.c')
| -rw-r--r-- | tree.c | 36 |
1 files changed, 34 insertions, 2 deletions
| @@ -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 | ||
| 557 | struct tree_node * | ||
| 558 | tree_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 | |||
| 574 | struct tree_node * | ||
| 575 | tree_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 | ||
| 559 | void | 591 | void |
| @@ -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 | ||
