From 3a2357e2a85cfdbd7e2ed6474dcd09e5fec47b85 Mon Sep 17 00:00:00 2001 From: wjf-hs Date: Mon, 24 Jun 2024 15:00:56 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B3=A8=E9=87=8A=E6=8E=89=E9=9D=9E=E5=BF=85?= =?UTF-8?q?=E8=A6=81=E4=BB=A3=E7=A0=81=EF=BC=8C=E5=AE=9E=E6=B5=8B=E5=8E=9F?= =?UTF-8?q?=E6=9D=A5=E6=97=A7=E5=B7=A5=E7=A8=8B=E7=9A=84=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E6=93=8D=E4=BD=9C=E6=98=AF=E6=AD=A3=E7=A1=AE=E7=9A=84=E3=80=82?= =?UTF-8?q?=E6=88=91=E7=8E=B0=E5=9C=A8=E8=BF=99=E4=B8=AA=E5=88=A0=E9=99=A4?= =?UTF-8?q?3=E7=9A=84=E6=97=B6=E5=80=99=EF=BC=8C=E6=B2=A1=E6=9C=89?= =?UTF-8?q?=E5=90=88=E9=80=82=E7=9A=84rebalance?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/tree.c | 65 +++++++++++++++++++++++++++++++++--------------------- 1 file changed, 40 insertions(+), 25 deletions(-) diff --git a/src/tree.c b/src/tree.c index a6cb84c..768319c 100644 --- a/src/tree.c +++ b/src/tree.c @@ -1737,19 +1737,19 @@ static bool tree_avl_delete_single_child(struct _tree* self, struct _tree_node* { if(node->left != NULL) { - node->left->parent = NULL; // step1 - self->_root = node->left; // step2 + node->left->parent = node->parent; // step1 : NULL for root + self->_root = node->left; // step2 // options - node->left = NULL; + // node->left = NULL; } else if(node->right != NULL) { - node->right->parent = NULL; // step1 - self->_root = node->right; // step2 + node->right->parent = node->parent; // step1 : NULL for root + self->_root = node->right; // step2 // options - node->right = NULL; + // node->right = NULL; } else { @@ -1764,28 +1764,28 @@ static bool tree_avl_delete_single_child(struct _tree* self, struct _tree_node* { node->left->parent = node->parent; // step1 node->parent->left = node->left; // step2 - node->left->right = node->right; // step3 : NULL for singly child - // options - node->left = NULL; - node->parent = NULL; + // node->left->right = node->right; // step3 : NULL for singly child + // // options + // node->left = NULL; + // node->parent = NULL; } else if(node->right != NULL) { node->right->parent = node->parent; // step1 node->parent->left = node->right; // step2 - node->right->left = node->left; // step3 : NULL for singly child - // options - node->right = NULL; - node->parent = NULL; + // node->right->left = node->left; // step3 : NULL for singly child + // // options + // node->right = NULL; + // node->parent = NULL; } else { node->parent->left = NULL; // options - node->parent = NULL; + // node->parent = NULL; } } else if(node->parent->right == node) @@ -1794,28 +1794,28 @@ static bool tree_avl_delete_single_child(struct _tree* self, struct _tree_node* { node->left->parent = node->parent; // step1 node->parent->right = node->left; // step2 - node->left->right = node->right; // step3 : NULL for singly child - // options - node->left = NULL; - node->parent = NULL; + // node->left->right = node->right; // step3 : NULL for singly child + // // options + // node->left = NULL; + // node->parent = NULL; } else if(node->right != NULL) { node->right->parent = node->parent; // step1 node->parent->right = node->right; // step2 - node->right->left = node->left; // step3 : NULL for singly child - // options - node->right = NULL; - node->parent = NULL; + // node->right->left = node->left; // step3 : NULL for singly child + // // options + // node->right = NULL; + // node->parent = NULL; } else { node->parent->right = NULL; // options - node->parent = NULL; + // node->parent = NULL; } } @@ -1862,7 +1862,7 @@ bool tree_avl_delete(struct _tree* self, void* obj) // debug self->print_obj(obj); - if(node->left != NULL && node->right != NULL) + if((node->left != NULL) && (node->right != NULL)) { // have two child tree_avl_delete_double_child(self, node); @@ -2083,6 +2083,7 @@ void tree_avl_breadth(struct _tree* self, struct _tree_node* root) static struct _tree_node* tree_find_min(struct _tree* self, struct _tree_node* root) { assert(self != NULL); +#if 0 if(root == NULL) { return NULL; @@ -2092,6 +2093,20 @@ static struct _tree_node* tree_find_min(struct _tree* self, struct _tree_node* r return root; } return tree_find_min(self, root->left); +#else + while(root == NULL) + { + if(root->left != NULL) + { + root = root->left; + } + else + { + break; + } + } + return root; +#endif } static struct _tree_node* tree_find_max(struct _tree* self, struct _tree_node* root)