From 4fa3a06e8acdab2f29c605c664497dbc5bf96f35 Mon Sep 17 00:00:00 2001 From: wjf-hs Date: Tue, 25 Jun 2024 09:47:43 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=A8=E6=A0=88=E5=AE=9E=E7=8E=B0=E6=B1=82?= =?UTF-8?q?=E9=AB=98=E5=BA=A6=EF=BC=8C=E5=8F=A6=E5=A4=96=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=B8=AD=E5=BA=8F=E9=81=8D=E5=8E=86=E4=BB=A3=E7=A0=81=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mk.bat | 4 ++-- src/tree.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 63 insertions(+), 11 deletions(-) diff --git a/mk.bat b/mk.bat index 367c0f1..a0b52b7 100644 --- a/mk.bat +++ b/mk.bat @@ -1,8 +1,8 @@ @REM D:\Lang\cmake-3.27.5-windows-x86_64\bin\cmake.EXE --no-warn-unused-cli -DCMAKE_BUILD_TYPE:STRING=Debug -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE -DCMAKE_C_COMPILER:FILEPATH=D:\Software\mingw64\bin\gcc.exe -DCMAKE_CXX_COMPILER:FILEPATH=D:\Software\mingw64\bin\g++.exe -SF:/OpenDemo/1_vsc_cmake -Bf:/OpenDemo/1_vsc_cmake/build -G "MinGW Makefiles" @REM cmake -Bbuild -G "Visual Studio 17 2022" -@REM cmake -B build -G "MinGW Makefiles" -cmake -B build -G "Unix Makefiles" +cmake -B build -G "MinGW Makefiles" +@REM cmake -B build -G "Unix Makefiles" make -C build make -C build install diff --git a/src/tree.c b/src/tree.c index 4652945..4a74bec 100644 --- a/src/tree.c +++ b/src/tree.c @@ -1521,14 +1521,50 @@ 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 assert(self != NULL); if(root == NULL) { return 0; } - uint32_t left_height = tree_height(self, root->left); - uint32_t right_height = tree_height(self, root->right); + int32_t left_height = tree_height(self, root->left); + int32_t right_height = tree_height(self, root->right); return (left_height > right_height) ? (left_height + 1) : (right_height + 1); +#else + assert(self != NULL); + if(root == NULL) + { + return 0; + } + struct _tree_node *node = root; + int32_t left_height = 0, right_height = 0; + int32_t left_height_max = 0, right_height_max = 0; + + stack_t stack = stack_new(); + stack_init(stack, sizeof(struct _tree_node*)); + stack->push(stack, &root); + while(!stack->empty(stack)) + { + stack->pop(stack, &node); + left_height = stack->size(stack); + if(left_height > left_height_max) + { + left_height_max = left_height; + } + + if(node->right != NULL) + { + stack->push(stack, &node->right); + } + if(node->left != NULL) + { + stack->push(stack, &node->left); + } + } + stack_free(stack); + + return left_height_max > right_height_max ? left_height_max : right_height_max; +#endif } /** @@ -2069,7 +2105,7 @@ void tree_avl_inorder(struct _tree* self, struct _tree_node* root) if(!self->_right_priority) { - while(node != NULL || !stack->empty(stack)) + while(!stack->empty(stack) || node != NULL) { while(node != NULL) { @@ -2077,12 +2113,20 @@ void tree_avl_inorder(struct _tree* self, struct _tree_node* root) node = node->left; } - do + // 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)) { stack->pop(stack, &node); self->print_obj(node->obj); - }while(node->right == NULL && !stack->empty(stack)); - node = node->right; + node = node->right; + } } } else @@ -2095,12 +2139,20 @@ void tree_avl_inorder(struct _tree* self, struct _tree_node* root) node = node->right; } - do + // 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)) { stack->pop(stack, &node); self->print_obj(node->obj); - }while(node->left == NULL && !stack->empty(stack)); - node = node->left; + node = node->left; + } } } stack_free(stack);