明天继续吧,困了

This commit is contained in:
建峰 2024-06-23 01:37:33 +08:00
parent 88e2ac7136
commit 4f00844fa6
2 changed files with 71 additions and 20 deletions

View File

@ -81,7 +81,7 @@ typedef struct _tree_node * tree_node_t;
struct _tree struct _tree
{ {
struct _tree_node * _head; struct _tree_node * _root;
uint32_t _size; // 栈大小 uint32_t _size; // 栈大小
uint32_t _obj_size; // 元素大小 uint32_t _obj_size; // 元素大小
@ -97,14 +97,28 @@ struct _tree
bool (*empty)(struct _tree* self); bool (*empty)(struct _tree* self);
uint32_t (*size)(struct _tree* self); uint32_t (*size)(struct _tree* self);
// compare /**
int (*compare)(void* obj1, void* obj2); * @brief obj compare with obj2
*
* @return
* obj < obj2 return -1
* obj == obj2 return 0
* obj > obj2 return 1
*/
int (*compare)(void* obj, void* obj2);
// free // free
void (*destory)(struct _tree* self); void (*destory)(struct _tree* self);
// print
void (*print)(struct _tree* self); // ----- print -----
// traversal depth
void (*preorder)(struct _tree* self);
void (*inorder)(struct _tree* self);
void (*postorder)(struct _tree* self);
// traversal breadth
void (*breadth)(struct _tree* self);
void (*print_obj)(void* obj); void (*print_obj)(void* obj);
}; };

View File

@ -1439,7 +1439,43 @@ static bool tree_node_free(struct _tree_node* node)
bool tree_avl_insert(struct _tree* self, void* obj) bool tree_avl_insert(struct _tree* self, void* obj)
{ {
assert(self != NULL);
assert(obj != NULL);
assert(self->compare != NULL);
struct _tree_node* node = tree_node_new(self, obj);
if(node == NULL)
{
return false;
}
// if no root
if(self->_root == NULL)
{
self->_root = node;
}
else
{
// insert the node
struct _tree_node* root = self->_root;
if(self->compare(obj, root->obj) < 0)
{
root->left = node;
}
else if(self->compare(obj, root->obj) > 0)
{
root->right = node;
}
else
{
// if obj exist, just return false
tree_node_free(node);
return false;
}
}
self->_size++;
return true;
} }
bool tree_avl_delete(struct _tree* self, void* obj) bool tree_avl_delete(struct _tree* self, void* obj)
@ -1472,13 +1508,21 @@ void tree_destory(struct _tree* self)
self->clear(self); self->clear(self);
} }
// print void tree_avl_preorder(struct _tree* self)
void tree_print(struct _tree* self) {
}
void tree_avl_inorder(struct _tree* self)
{
}
void tree_avl_postorder(struct _tree* self)
{ {
} }
void tree_print_obj(void* obj) // traversal breadth
void tree_avl_breadth(struct _tree* self)
{ {
} }
@ -1498,17 +1542,10 @@ bool tree_avl_init(struct _tree *self, uint32_t obj_size)
self->empty = tree_empty; self->empty = tree_empty;
self->size = tree_size; self->size = tree_size;
self->destory = tree_destory; self->destory = tree_destory;
self->print = tree_print; self->preorder = tree_avl_preorder;
self->inorder = tree_avl_inorder;
self->_head = (struct _tree_node *)malloc(sizeof(struct _tree_node)); self->postorder = tree_avl_postorder;
if(self->_head == NULL) self->breadth = tree_avl_breadth;
{
return false;
}
self->_head->parent = NULL;
self->_head->left = NULL;
self->_head->right = NULL;
self->_head->balance = 0;
return true; return true;
} }