From e261a7b5189e893e0d5c3eac7fe269f45c87cd23 Mon Sep 17 00:00:00 2001 From: Akos Horvath Date: Sun, 7 Apr 2024 13:43:43 +0200 Subject: [PATCH] simplify wm_postorder_traversal --- src/util.c | 64 ++++++++++-------------------------------------------- 1 file changed, 12 insertions(+), 52 deletions(-) diff --git a/src/util.c b/src/util.c index 6adaef1..51ca8e9 100644 --- a/src/util.c +++ b/src/util.c @@ -384,61 +384,21 @@ UIntArray* wm_treenode_all_lmds_index(TreeNode *node) return ret; } +static void traversal(TreeNode *node, NodeArray *arr) +{ + if (!node) return; + + for (size_t i = 0; i < node->children->size; i++) + traversal(node->children->nodes[i], arr); + + wm_nodearray_push(arr, node); +} + NodeArray* wm_postorder_traversal(TreeNode *tree) { - assert(tree); + NodeArray *ret = wm_nodearray_new(); - TreeNode *root = tree; - - typedef struct { - TreeNode *node; - size_t index; - } NodeWithIndex; - - int root_index = 0; - - NodeArray* stack = wm_nodearray_new(); - NodeArray* ret = wm_nodearray_new(); - - while (root != NULL || stack->size > 0) { - if (root != NULL) { - NodeWithIndex *n = malloc(sizeof(NodeWithIndex)); - assert(n); - n->node = root; - n->index = root_index; - wm_nodearray_push(stack, (void*)n); - root_index = 0; - - if (root->children->size >= 1) - root = root->children->nodes[0]; - else root = NULL; - - continue; - } - - NodeWithIndex *nptr; - wm_nodearray_pop(stack, (TreeNode**)(void**)&nptr); - NodeWithIndex n = *nptr; - free(nptr); - wm_nodearray_push(ret, n.node); - - while (stack->size > 0 && n.index == ((NodeWithIndex**)stack->nodes) - [stack->size-1]->node->children->size - 1) { - wm_nodearray_pop(stack, (TreeNode**)(void**)&nptr); - n = *nptr; - free(nptr); - - wm_nodearray_push(ret, n.node); - } - - if (stack->size > 0) { - root = ((NodeWithIndex**)stack->nodes)[stack->size-1]->node - ->children->nodes[n.index + 1]; - root_index = n.index + 1; - } - } - - wm_nodearray_free(stack); + traversal(tree, ret); return ret; }