From 1f6dea6a6742a878eb8c0b33e895cbd62bb54f32 Mon Sep 17 00:00:00 2001 From: wjf-hs Date: Tue, 25 Jun 2024 10:03:25 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8E=E5=BA=8F=E9=81=8D=E5=8E=86=E4=B9=9F?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E6=A0=88=E5=AE=9E=E7=8E=B0=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/tree.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 59 insertions(+), 3 deletions(-) diff --git a/src/tree.c b/src/tree.c index 4a74bec..32e0d17 100644 --- a/src/tree.c +++ b/src/tree.c @@ -1521,7 +1521,7 @@ static struct _tree_node* tree_trun_right_then_left(struct _tree* self, struct _ int32_t tree_height(struct _tree* self, struct _tree_node* root) { -#if 0 +#if 1 assert(self != NULL); if(root == NULL) { @@ -2029,9 +2029,10 @@ void tree_avl_preorder(struct _tree* self, struct _tree_node* root) while(!stack->empty(stack)) { stack->pop(stack, &node); + self->print_obj(node->obj); + if(!self->_right_priority) // left priority { - self->print_obj(node->obj); if(node->right != NULL) { stack->push(stack, &node->right); @@ -2043,7 +2044,6 @@ void tree_avl_preorder(struct _tree* self, struct _tree_node* root) } else { - self->print_obj(node->obj); if(node->left != NULL) { stack->push(stack, &node->left); @@ -2161,6 +2161,7 @@ void tree_avl_inorder(struct _tree* self, struct _tree_node* root) void tree_avl_postorder(struct _tree* self, struct _tree_node* root) { +#if 0 assert(self != NULL); if(root == NULL) { @@ -2191,6 +2192,61 @@ void tree_avl_postorder(struct _tree* self, struct _tree_node* root) } self->print_obj(root->obj); } +#else + assert(self != NULL); + if(root == NULL) + { + return; + } + struct _tree_node* node = NULL; + + stack_t stack2 = stack_new(); + stack_init(stack2, sizeof(struct _tree_node*)); + + // left: postorder == right: the reverse of preorder + // so we use stack2 to store the right node + stack_t stack = stack_new(); + stack_init(stack, sizeof(struct _tree_node*)); + stack->push(stack, &root); + while(!stack->empty(stack)) + { + stack->pop(stack, &node); + // self->print_obj(node->obj); + stack2->push(stack2, &node); + + if(!self->_right_priority) // left priority + { + if(node->left != NULL) + { + stack->push(stack, &node->left); + } + if(node->right != NULL) + { + stack->push(stack, &node->right); + } + } + else + { + if(node->right != NULL) + { + stack->push(stack, &node->right); + } + if(node->left != NULL) + { + stack->push(stack, &node->left); + } + } + } + + while(!stack2->empty(stack2)) + { + stack2->pop(stack2, &node); + self->print_obj(node->obj); + } + + stack_free(stack); + stack_free(stack2); +#endif } // traversal breadth