From 229e3f11403e2fc737c75773c826ea66b71b99d5 Mon Sep 17 00:00:00 2001 From: wjf-hs Date: Tue, 25 Jun 2024 10:50:21 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=8F=E8=BF=87=E5=88=86=E6=9E=90=EF=BC=8C?= =?UTF-8?q?=E5=8F=91=E7=8E=B0=E8=BF=98=E6=98=AF=E5=8E=9F=E6=9D=A5=E7=9A=84?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=EF=BC=8C=E5=AF=B9=E5=89=8D=E5=BA=8F=E3=80=81?= =?UTF-8?q?=E4=B8=AD=E5=BA=8F=E3=80=81=E5=90=8E=E5=BA=8F=E4=B8=89=E7=A7=8D?= =?UTF-8?q?=E9=81=8D=E5=8E=86=E6=96=B9=E5=BC=8F=E5=86=99=E7=9A=84=E7=AE=80?= =?UTF-8?q?=E4=BB=8B=E3=80=82=E4=BA=8E=E6=98=AF=E5=B0=B1=E5=8F=82=E8=80=83?= =?UTF-8?q?=E5=B9=B6=E4=BC=98=E5=8C=96=E4=BA=86=E5=BD=93=E5=89=8D=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/tree.c | 113 ++++++++++++++++++++++++++--------------------------- 1 file changed, 55 insertions(+), 58 deletions(-) diff --git a/src/tree.c b/src/tree.c index 32e0d17..b74554d 100644 --- a/src/tree.c +++ b/src/tree.c @@ -2021,36 +2021,44 @@ void tree_avl_preorder(struct _tree* self, struct _tree_node* root) { return; } - struct _tree_node* node = NULL; + struct _tree_node* node = root; 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); - if(!self->_right_priority) // left priority + if(!self->_right_priority) // left priority + { + while(!stack->empty(stack) || node != NULL) { - if(node->right != NULL) + if(node != NULL) { - stack->push(stack, &node->right); + self->print_obj(node->obj); + + stack->push(stack, &node); + node = node->left; } - if(node->left != NULL) + else { - stack->push(stack, &node->left); + stack->pop(stack, &node); + node = node->right; } } - else + } + else + { + while(!stack->empty(stack) || node != NULL) { - if(node->left != NULL) + if(node != NULL) { - stack->push(stack, &node->left); + self->print_obj(node->obj); + + stack->push(stack, &node); + node = node->right; } - if(node->right != NULL) + else { - stack->push(stack, &node->right); + stack->pop(stack, &node); + node = node->left; } } } @@ -2103,28 +2111,20 @@ void tree_avl_inorder(struct _tree* self, struct _tree_node* root) stack_t stack = stack_new(); stack_init(stack, sizeof(struct _tree_node*)); - if(!self->_right_priority) + if(!self->_right_priority) // left priority { while(!stack->empty(stack) || node != NULL) { - while(node != NULL) + if(node != NULL) { stack->push(stack, &node); node = node->left; } - - // do - // { - // stack->pop(stack, &node); - // self->print_obj(node->obj); - // }while(node->right == NULL && !stack->empty(stack)); - // node = node->right; - - // optimize code - if(!stack->empty(stack)) + else { stack->pop(stack, &node); self->print_obj(node->obj); + node = node->right; } } @@ -2133,21 +2133,12 @@ void tree_avl_inorder(struct _tree* self, struct _tree_node* root) { while(node != NULL || !stack->empty(stack)) { - while(node != NULL) + if(node != NULL) { stack->push(stack, &node); node = node->right; } - - // do - // { - // stack->pop(stack, &node); - // self->print_obj(node->obj); - // }while(node->left == NULL && !stack->empty(stack)); - // node = node->left; - - // optimize code - if(!stack->empty(stack)) + else { stack->pop(stack, &node); self->print_obj(node->obj); @@ -2198,42 +2189,48 @@ void tree_avl_postorder(struct _tree* self, struct _tree_node* root) { return; } - struct _tree_node* node = NULL; + struct _tree_node* node = root; 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 + // because: left:postorder == right:the reverse of preorder 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(!self->_right_priority) // left priority + { + while(!stack->empty(stack) || node != NULL) { - if(node->left != NULL) + if(node != NULL) { - stack->push(stack, &node->left); + stack2->push(stack2, &node); + + stack->push(stack, &node); + node = node->right; } - if(node->right != NULL) + else { - stack->push(stack, &node->right); + stack->pop(stack, &node); + node = node->left; } } - else + } + else + { + while(!stack->empty(stack) || node != NULL) { - if(node->right != NULL) + if(node != NULL) { - stack->push(stack, &node->right); + stack2->push(stack2, &node); + + stack->push(stack, &node); + node = node->left; } - if(node->left != NULL) + else { - stack->push(stack, &node->left); + stack->pop(stack, &node); + node = node->right; } } }