From 59e84f713128ff956988044deb396c05c5a52c3b Mon Sep 17 00:00:00 2001 From: wjf-hs Date: Mon, 24 Jun 2024 14:00:09 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E9=99=A4=E8=8A=82=E7=82=B9=E6=97=B6?= =?UTF-8?q?=E6=9C=89=E6=A6=82=E7=8E=87=E5=8D=A1=E6=AD=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/tree.c | 66 ++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 49 insertions(+), 17 deletions(-) diff --git a/src/tree.c b/src/tree.c index a5a1b2c..a6cb84c 100644 --- a/src/tree.c +++ b/src/tree.c @@ -1737,13 +1737,19 @@ static bool tree_avl_delete_single_child(struct _tree* self, struct _tree_node* { if(node->left != NULL) { - node->left->parent = NULL; - self->_root = node->left; + node->left->parent = NULL; // step1 + self->_root = node->left; // step2 + + // options + node->left = NULL; } else if(node->right != NULL) { - node->right->parent = NULL; - self->_root = node->right; + node->right->parent = NULL; // step1 + self->_root = node->right; // step2 + + // options + node->right = NULL; } else { @@ -1756,34 +1762,60 @@ static bool tree_avl_delete_single_child(struct _tree* self, struct _tree_node* { if(node->left != NULL) { - node->left->parent = node->parent; - node->parent->left = node->left; + 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; } else if(node->right != NULL) { - node->right->parent = node->parent; - node->parent->left = node->right; + 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; } else { node->parent->left = NULL; + + // options + node->parent = NULL; } } else if(node->parent->right == node) { if(node->left != NULL) { - node->left->parent = node->parent; - node->parent->right = node->left; + 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; } else if(node->right != NULL) { - node->right->parent = node->parent; - node->parent->right = node->right; + 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; } else { node->parent->right = NULL; + + // options + node->parent = NULL; } } @@ -1801,11 +1833,11 @@ static bool tree_avl_delete_double_child(struct _tree* self, struct _tree_node* if(tmp != NULL) { memmove(node->obj, tmp->obj, self->_obj_size); - if(tmp->right != NULL) - { - node->right = tmp->right; - tmp->right->parent = node; - } + // if(tmp->right != NULL) + // { + // node->right = tmp->right; + // tmp->right->parent = node; + // } tree_avl_delete_single_child(self, tmp); } return true;