From 8d2e254c3eb50639630cf297fe9185ca7244aa51 Mon Sep 17 00:00:00 2001 From: wjf-hs Date: Mon, 1 Jul 2024 14:51:52 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8D=95=E6=AD=A5=E8=B7=9F=E8=BF=9B=EF=BC=8C?= =?UTF-8?q?=E7=A1=AE=E8=AE=A4rbt=E6=8F=92=E5=85=A5=E6=B2=A1=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/test_tree.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/test/test_tree.c b/test/test_tree.c index 053a3d4..c478005 100644 --- a/test/test_tree.c +++ b/test/test_tree.c @@ -126,7 +126,86 @@ void test_avltree_num(void) tree_free(tree); } +bool tree_rb_check(struct _tree* self, struct _tree_node* root) +{ + assert(self != NULL); + if(root == NULL) + { + return false; + } + struct _tree_node* node = root; + queue_t queue = queue_new(); + queue_init(queue, sizeof(struct _tree_node*)); + + if(node != NULL) + { + queue->push(queue, &node); + while(!queue->empty(queue)) + { + queue->pop(queue, &node); + if(!self->_right_priority) + { + if(node->left != NULL) + { + queue->push(queue, &node->left); + } + if(node->right != NULL) + { + queue->push(queue, &node->right); + } + } + else + { + if(node->right != NULL) + { + queue->push(queue, &node->right); + } + if(node->left != NULL) + { + queue->push(queue, &node->left); + } + } + + if(node->color == RBT_RED) + { + if(node->parent != NULL) + { + if(node->parent->color == RBT_RED) + { + return false; + } + } + + if(node->left != NULL) + { + if(node->left->color == RBT_RED) + { + return false; + } + } + + if(node->right != NULL) + { + if(node->right->color == RBT_RED) + { + return false; + } + } + } + + if(node->parent == NULL) + { + if(self->_root != node || node->color != RBT_BLACK) + { + return false; + } + } + } + } + queue_free(queue); + return true; +} /** * @brief @@ -161,6 +240,14 @@ void test_rbtree_num(void) printf("\n"); } + printf("----- rb_check -----\n"); + bool ret = tree_rb_check(tree, tree->_root); + if(ret != true) + { + printf("----- rb_check_error -----\n"); + return; + } + printf("----- max -----\n"); tree->max(tree, &temp); tree->print_obj(&temp);