From 7ba86577b14ab4f94b33ebc12e57654f569d6575 Mon Sep 17 00:00:00 2001 From: jf-home Date: Sun, 23 Jun 2024 22:25:52 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9cmake=E5=81=B6=E5=B0=94?= =?UTF-8?q?=E6=8A=A5=E5=BC=82=E5=B8=B8=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakelists.txt | 2 +- mk.bat | 3 ++- src/tree.c | 21 +++++++++++++-------- 3 files changed, 16 insertions(+), 10 deletions(-) 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++;