diff --git a/CMakelists.txt b/CMakelists.txt index c1f602d..c952eb2 100644 --- a/CMakelists.txt +++ b/CMakelists.txt @@ -1,6 +1,6 @@ # 0. cmake 最低版本号要求 -cmake_minimum_required(VERSION 3.8) +cmake_minimum_required(VERSION 3.28) # 0. 项目信息 project(demo) diff --git a/mk.bat b/mk.bat index 9f1b0f1..367c0f1 100644 --- a/mk.bat +++ b/mk.bat @@ -1,7 +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" -cmake -B build -G "MinGW Makefiles" +@REM cmake -B build -G "MinGW Makefiles" +cmake -B build -G "Unix Makefiles" make -C build make -C build install diff --git a/src/tree.c b/src/tree.c index ab5f17d..de323d6 100644 --- a/src/tree.c +++ b/src/tree.c @@ -1496,10 +1496,10 @@ static void tree_set_balance(struct _tree* self, struct _tree_node * node) * * | 情况 | root->balance | node->balance | 调整方式 | * | ---- | ------------ | -------------- | -------- | - * | 1 | > 0 | > 0 | 左旋 - * | 2 | > 0 | < 0 | 先右旋后左旋 - * | 3 | < 0 | < 0 | 右旋 - * | 4 | < 0 | > 0 | 先右旋后左旋 + * | 1 | > 1 | > 0 | 左旋 + * | 2 | > 1 | < 0 | 先右旋后左旋 + * | 3 | < -1 | < 0 | 右旋 + * | 4 | < -1 | > 0 | 先右旋后左旋 * * @param self * @return true @@ -1508,13 +1508,14 @@ static void tree_set_balance(struct _tree* self, struct _tree_node * node) static bool tree_avl_rebalance(struct _tree* self, struct _tree_node* root) { assert(self != NULL); - if((root == NULL) || (root->left == NULL) || (root->right == NULL)) + if(root == NULL) { return true; } + tree_set_balance(self, root); int balance = root->balance; - if(balance > 0) + if(balance > 1) { if(root->right->balance > 0) { @@ -1525,7 +1526,7 @@ static bool tree_avl_rebalance(struct _tree* self, struct _tree_node* root) root = tree_trun_left_then_right(self, root); } } - else if(balance < 0) + else if(balance < 1) { if(root->left->balance < 0) { @@ -1537,7 +1538,10 @@ static bool tree_avl_rebalance(struct _tree* self, struct _tree_node* root) } } - tree_set_balance(self, root); + if(root->parent != NULL) + { + tree_avl_rebalance(self, root->parent); + } return true; } @@ -1665,6 +1669,7 @@ bool tree_avl_insert(struct _tree* self, void* obj) tree_node_free(node); return false; } + self->rebalance(self, root); } self->_size++;