diff --git a/include/tree.h b/include/tree.h index 8962f4b..8c70ce6 100644 --- a/include/tree.h +++ b/include/tree.h @@ -120,10 +120,9 @@ struct _tree // free void (*destory)(struct _tree* self); - // ----- print ----- // traversal depth - void (*preorder)(struct _tree* self); + void (*preorder)(struct _tree* self, struct _tree_node* root); void (*inorder)(struct _tree* self); void (*postorder)(struct _tree* self); // traversal breadth @@ -131,11 +130,14 @@ struct _tree void (*print_obj)(void* obj); }; +typedef struct _tree* tree_t; // bst_tree bool tree_avl_init(struct _tree *self, uint32_t obj_size); bool tree_rb_init(struct _tree *self, uint32_t obj_size); +tree_t tree_new(void); +void tree_free(tree_t tree); #endif // _TREE_H_ diff --git a/src/tree.c b/src/tree.c index 1f75ad8..e7045db 100644 --- a/src/tree.c +++ b/src/tree.c @@ -1404,6 +1404,8 @@ static bool tree_rebalance(ptree_t head, ptree_node_t tree) static tree_node_t tree_node_new(struct _tree* self, void* obj) { + assert(self != NULL); + void * obj_new = malloc(self->_obj_size); if (obj_new == NULL) { @@ -1437,12 +1439,14 @@ done: static bool tree_node_free(struct _tree_node* node) { - assert(node != NULL); - if(node->obj != NULL) + if(node != NULL) { - free(node->obj); + if(node->obj != NULL) + { + free(node->obj); + } + free(node); } - free(node); return true; } @@ -1470,10 +1474,12 @@ bool tree_avl_insert(struct _tree* self, void* obj) if(self->compare(obj, root->obj) < 0) { root->left = node; + node->parent = root; } else if(self->compare(obj, root->obj) > 0) { root->right = node; + node->parent = root; } else { @@ -1517,14 +1523,25 @@ void tree_destory(struct _tree* self) self->clear(self); } -void tree_avl_preorder(struct _tree* self) +void tree_avl_preorder(struct _tree* self, struct _tree_node* root) { - + assert(self != NULL); + if(root->left != NULL) + { + tree_avl_preorder(self, root->left); + } + self->print_obj(root->obj); + if(root->right != NULL) + { + tree_avl_preorder(self, root->right); + } } + void tree_avl_inorder(struct _tree* self) { } + void tree_avl_postorder(struct _tree* self) { @@ -1563,3 +1580,17 @@ bool tree_rb_init(struct _tree *self, uint32_t obj_size) { } + +tree_t tree_new(void) +{ + return (struct _tree*)malloc(sizeof(struct _tree)); +} + +void tree_free(tree_t tree) +{ + if(tree != NULL) + { + tree->destory(tree); + free(tree); + } +} diff --git a/test/test.c b/test/test.c index 4699460..2b4e99f 100644 --- a/test/test.c +++ b/test/test.c @@ -6,6 +6,14 @@ void print_num(void* obj) printf("(%2d ) ", *(int*)obj); } +int compare_num(void *obj, void *obj2) +{ + int num1 = *(int*)obj; + int num2 = *(int*)obj2; + return num1 - num2 > 0 ? 1 : -1; +} + + void print_struct(void* obj) { struct _student* student = (struct _student*)obj; @@ -27,12 +35,12 @@ int main() printf("----- unicstl test -----\n"); // while (1) { - test_list(); - test_stack(); - test_deque(); - test_queue(); - - // tree_test(); + // test_list(); + // test_stack(); + // test_deque(); + // test_queue(); + test_tree(); + // rbtree_test(); } return 0; diff --git a/test/test.h b/test/test.h index c5c079d..58c5da9 100644 --- a/test/test.h +++ b/test/test.h @@ -17,6 +17,8 @@ struct _student }; void print_num(void* obj); +int compare_num(void *obj, void *obj2); + void print_char(void* obj); void print_struct(void* obj); void print_str(void* obj); @@ -29,10 +31,8 @@ void print_str(void* obj); void test_list(void); void test_stack(void); void test_deque(void); - void test_queue(void); -void tree_test(void); -void rbtree_test(void); +void test_tree(void); #endif // _TEST_H_ diff --git a/test/tree_test.c b/test/tree_test.c index 9f32092..a26a440 100644 --- a/test/tree_test.c +++ b/test/tree_test.c @@ -265,7 +265,35 @@ void tree_test(void) printf("----------------------------------------\n"); } #endif - - #endif +void test_tree_num(void) +{ + uint32_t i = 0; + int data[] = { 1,2,3,4,5,6,7,8,9,10 }; + int temp = 0; + uint32_t len = sizeof(data) / sizeof(data[0]); + + tree_t tree = tree_new(); + tree_avl_init(tree, sizeof(int)); + tree->print_obj = print_num; + tree->compare = compare_num; + + printf("\n\n----- test_queue_num -----\n"); + + printf("----- after push-----\n"); + for (i = 0; i < len; i++) + { + tree->insert(tree, &data[i]); + } + printf("----- preorder -----\n"); + tree->preorder(tree, tree->_root); + printf("\n"); + + tree_free(tree); +} + +void test_tree(void) +{ + test_tree_num(); +}