aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tree.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/tree.c b/tree.c
index 3c6a65c..b2819f0 100644
--- a/tree.c
+++ b/tree.c
@@ -299,6 +299,12 @@ stack_pop(struct stack *stack, struct tree_node **data)
299 return false; 299 return false;
300} 300}
301 301
302static struct tree_node *
303stack_peek(struct stack *stack)
304{
305 return (stack->head != NULL) ? stack->head->data : NULL;
306}
307
302static bool 308static bool
303stack_empty(struct stack *stack) 309stack_empty(struct stack *stack)
304{ 310{
@@ -363,6 +369,44 @@ tree_apply_inorder_it(struct tree_node *tree, void (*visit)(T key, void *cl), vo
363 } 369 }
364} 370}
365 371
372// Hier eine Version für PostOrder-Iterativ:
373// Quelle: https://stackoverflow.com/a/16092333
374
375void
376tree_apply_postorder_it(struct tree_node *tree, void (*visit)(T key, void *cl), void *cl)
377{
378 if ( tree != NULL ) {
379 struct stack stack;
380
381 stack_init(&stack);
382 stack_push(&stack, tree);
383
384 while ( !stack_empty(&stack) ) {
385 struct tree_node *next = stack_peek(&stack);
386
387 bool finishedSubtrees = (next->left == tree || next->right == tree);
388 bool isLeaf = (next->left == NULL && next->right == NULL);
389
390 if ( finishedSubtrees || isLeaf ) {
391 stack_pop(&stack, &next);
392
393 visit(next->key, cl);
394
395 tree = next;
396 }
397 else {
398 if ( next->right != NULL ) {
399 stack_push(&stack, next->right);
400 }
401 if ( next->left != NULL ) {
402 stack_push(&stack, next->left);
403 }
404 }
405 }
406 stack_free(&stack);
407 }
408}
409
366/* ======================== */ 410/* ======================== */
367 411
368struct tree_iterator { 412struct tree_iterator {
@@ -495,6 +539,10 @@ main(void)
495 tree = tree_insert_it(tree, 18); 539 tree = tree_insert_it(tree, 18);
496 540
497 tree_apply_preorder(tree, print, NULL); 541 tree_apply_preorder(tree, print, NULL);
542 puts("postorder:");
543 tree_apply_postorder(tree, print, NULL);
544 puts("postorder_it:");
545 tree_apply_postorder_it(tree, print, NULL);
498 546
499 show_tree(tree, 0, 0); 547 show_tree(tree, 0, 0);
500 548