diff options
| -rw-r--r-- | tree.c | 48 |
1 files changed, 48 insertions, 0 deletions
| @@ -299,6 +299,12 @@ stack_pop(struct stack *stack, struct tree_node **data) | |||
| 299 | return false; | 299 | return false; |
| 300 | } | 300 | } |
| 301 | 301 | ||
| 302 | static struct tree_node * | ||
| 303 | stack_peek(struct stack *stack) | ||
| 304 | { | ||
| 305 | return (stack->head != NULL) ? stack->head->data : NULL; | ||
| 306 | } | ||
| 307 | |||
| 302 | static bool | 308 | static bool |
| 303 | stack_empty(struct stack *stack) | 309 | stack_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 | |||
| 375 | void | ||
| 376 | tree_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 | ||
| 368 | struct tree_iterator { | 412 | struct 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 | ||
