添加tree

This commit is contained in:
建峰 2024-06-23 01:05:33 +08:00
parent 8f11e431b5
commit 88e2ac7136
4 changed files with 209 additions and 35 deletions

View File

@ -6,6 +6,7 @@
"unicstl.h": "c",
"test.h": "c",
"queue.h": "c",
"stdbool.h": "c"
"stdbool.h": "c",
"stdint.h": "c"
}
}

View File

@ -16,6 +16,6 @@
| **queue** | | **队列**
| queue_init | 单向链表 | |
| queue2_init | 数组 | FIFO/空/满 |
| **deque** | **Ë«¶Ë¶ÓÁÐ** |
| **deque** | |**Ë«¶Ë¶ÓÁÐ** |
| deque_init | 双向循环链表 | |

View File

@ -64,6 +64,54 @@ typedef void (*tree_data_disp_t)(tree_data_t data);
void tree_traversal_breadth(ptree_t head, tree_data_disp_t tree_data_disp);
#endif
struct _tree_node
{
void *obj;
struct _tree_node * left;
struct _tree_node * right;
struct _tree_node * parent;
union
{
uint32_t balance;
uint32_t color;
};
};
typedef struct _tree_node * tree_node_t;
struct _tree
{
struct _tree_node * _head;
uint32_t _size; // 栈大小
uint32_t _obj_size; // 元素大小
uint32_t _capacity; // 总容量
uint32_t _ratio; // 扩展比率
// kernel
bool (*insert)(struct _tree* self, void* obj);
bool (*delete)(struct _tree* self, void* obj);
bool (*peek)(struct _tree* self, void** obj);
bool (*clear)(struct _tree* self);
bool (*empty)(struct _tree* self);
uint32_t (*size)(struct _tree* self);
// compare
int (*compare)(void* obj1, void* obj2);
// free
void (*destory)(struct _tree* self);
// print
void (*print)(struct _tree* self);
void (*print_obj)(void* obj);
};
// bst_tree
bool tree_avl_init(struct _tree *self, uint32_t obj_size);
bool tree_rb_init(struct _tree *self, uint32_t obj_size);
#endif // _TREE_H_

View File

@ -1392,3 +1392,128 @@ static bool tree_rebalance(ptree_t head, ptree_node_t tree)
#endif
static tree_node_t * tree_node_new(struct _tree* self, void* obj)
{
void * obj_new = malloc(self->_obj_size);
if (obj_new == NULL)
{
goto done;
}
memmove(obj_new, obj, self->_obj_size);
struct _tree_node* node_new = (struct _queue_node*)malloc(sizeof(struct _tree_node));
if(node_new == NULL)
{
goto done;
}
node_new->obj = obj_new;
node_new->parent = NULL;
node_new->left = NULL;
node_new->right = NULL;
node_new->balance = 0;
return node_new;
done:
if(obj_new != NULL)
{
free(obj_new);
}
if(node_new != NULL)
{
free(node_new);
}
return NULL;
}
static bool tree_node_free(struct _tree_node* node)
{
assert(node != NULL);
if(node->obj != NULL)
{
free(node->obj);
}
free(node);
return true;
}
bool tree_avl_insert(struct _tree* self, void* obj)
{
}
bool tree_avl_delete(struct _tree* self, void* obj)
{
}
bool tree_clear(struct _tree* self)
{
assert(self != NULL);
return true;
}
bool tree_empty(struct _tree* self)
{
assert(self != NULL);
return !self->size(self);
}
uint32_t tree_size(struct _tree* self)
{
assert(self != NULL);
return self->size(self);
}
// free
void tree_destory(struct _tree* self)
{
assert(self != NULL);
self->clear(self);
}
// print
void tree_print(struct _tree* self)
{
}
void tree_print_obj(void* obj)
{
}
bool tree_avl_init(struct _tree *self, uint32_t obj_size)
{
assert(self != NULL);
self->_obj_size = obj_size;
self->_size = 0;
// self->_capacity = 64;
// self->_ratio = 2;
self->insert = tree_avl_insert;
self->delete = tree_avl_delete;
self->clear = tree_clear;
self->empty = tree_empty;
self->size = tree_size;
self->destory = tree_destory;
self->print = tree_print;
self->_head = (struct _tree_node *)malloc(sizeof(struct _tree_node));
if(self->_head == NULL)
{
return false;
}
self->_head->parent = NULL;
self->_head->left = NULL;
self->_head->right = NULL;
self->_head->balance = 0;
return true;
}
bool tree_rb_init(struct _tree *self, uint32_t obj_size)
{
}