mirror of
https://gitee.com/apaki/unicstl.git
synced 2025-05-18 03:51:35 +08:00
添加tree
This commit is contained in:
parent
8f11e431b5
commit
88e2ac7136
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
@ -6,6 +6,7 @@
|
|||||||
"unicstl.h": "c",
|
"unicstl.h": "c",
|
||||||
"test.h": "c",
|
"test.h": "c",
|
||||||
"queue.h": "c",
|
"queue.h": "c",
|
||||||
"stdbool.h": "c"
|
"stdbool.h": "c",
|
||||||
|
"stdint.h": "c"
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -16,6 +16,6 @@
|
|||||||
| **queue** | | **队列**
|
| **queue** | | **队列**
|
||||||
| queue_init | 单向链表 | |
|
| queue_init | 单向链表 | |
|
||||||
| queue2_init | 数组 | FIFO/空/满 |
|
| queue2_init | 数组 | FIFO/空/满 |
|
||||||
| **deque** | **Ë«¶Ë¶ÓÁÐ** |
|
| **deque** | |**Ë«¶Ë¶ÓÁÐ** |
|
||||||
| deque_init | 双向循环链表 | |
|
| deque_init | 双向循环链表 | |
|
||||||
|
|
||||||
|
114
include/tree.h
114
include/tree.h
@ -8,18 +8,18 @@
|
|||||||
|
|
||||||
typedef struct _tree_node_t
|
typedef struct _tree_node_t
|
||||||
{
|
{
|
||||||
tree_data_t data;
|
tree_data_t data;
|
||||||
struct _tree_node_t * left;
|
struct _tree_node_t * left;
|
||||||
struct _tree_node_t * right;
|
struct _tree_node_t * right;
|
||||||
struct _tree_node_t * parent;
|
struct _tree_node_t * parent;
|
||||||
int32_t balance; // balance of avl tree
|
int32_t balance; // balance of avl tree
|
||||||
}tree_node_t, *ptree_node_t;
|
}tree_node_t, *ptree_node_t;
|
||||||
|
|
||||||
|
|
||||||
typedef struct _tree_t
|
typedef struct _tree_t
|
||||||
{
|
{
|
||||||
struct _tree_node_t * tree;
|
struct _tree_node_t * tree;
|
||||||
uint32_t size;
|
uint32_t size;
|
||||||
}tree_t, *ptree_t;
|
}tree_t, *ptree_t;
|
||||||
|
|
||||||
typedef void (*tree_data_disp_t)(tree_data_t data);
|
typedef void (*tree_data_disp_t)(tree_data_t data);
|
||||||
@ -28,42 +28,90 @@ typedef void (*tree_data_disp_t)(tree_data_t data);
|
|||||||
|
|
||||||
|
|
||||||
#if RAVLTREE == 1
|
#if RAVLTREE == 1
|
||||||
bool tree_init(ptree_node_t *head);
|
bool tree_init(ptree_node_t *head);
|
||||||
void tree_destroy(ptree_node_t *head);
|
void tree_destroy(ptree_node_t *head);
|
||||||
bool tree_empty(ptree_node_t head);
|
bool tree_empty(ptree_node_t head);
|
||||||
void tree_clear(ptree_node_t head);
|
void tree_clear(ptree_node_t head);
|
||||||
uint32_t tree_get_size(ptree_node_t head);
|
uint32_t tree_get_size(ptree_node_t head);
|
||||||
|
|
||||||
bool tree_insert(ptree_node_t head, tree_data_t data);
|
bool tree_insert(ptree_node_t head, tree_data_t data);
|
||||||
bool tree_delete(ptree_node_t head, tree_data_t data);
|
bool tree_delete(ptree_node_t head, tree_data_t data);
|
||||||
bool tree_get_min(ptree_node_t head, tree_data_t *data);
|
bool tree_get_min(ptree_node_t head, tree_data_t *data);
|
||||||
bool tree_get_max(ptree_node_t head, tree_data_t *data);
|
bool tree_get_max(ptree_node_t head, tree_data_t *data);
|
||||||
|
|
||||||
void tree_traversal_depth_preorder(ptree_node_t head, tree_data_disp_t tree_data_disp);
|
void tree_traversal_depth_preorder(ptree_node_t head, tree_data_disp_t tree_data_disp);
|
||||||
void tree_traversal_depth_inorder(ptree_node_t head, tree_data_disp_t tree_data_disp);
|
void tree_traversal_depth_inorder(ptree_node_t head, tree_data_disp_t tree_data_disp);
|
||||||
//void tree_traversal_depth_postorder(ptree_node_t head, tree_data_disp_t tree_data_disp);
|
//void tree_traversal_depth_postorder(ptree_node_t head, tree_data_disp_t tree_data_disp);
|
||||||
//void tree_traversal_breadth(ptree_node_t head, tree_data_disp_t tree_data_disp);
|
//void tree_traversal_breadth(ptree_node_t head, tree_data_disp_t tree_data_disp);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if AVLTREE == 1
|
#if AVLTREE == 1
|
||||||
bool tree_init(ptree_t *head);
|
bool tree_init(ptree_t *head);
|
||||||
void tree_destroy(ptree_t *head);
|
void tree_destroy(ptree_t *head);
|
||||||
bool tree_empty(ptree_t head);
|
bool tree_empty(ptree_t head);
|
||||||
void tree_clear(ptree_t head);
|
void tree_clear(ptree_t head);
|
||||||
uint32_t tree_get_size(ptree_t head);
|
uint32_t tree_get_size(ptree_t head);
|
||||||
|
|
||||||
bool tree_insert(ptree_t head, tree_data_t data);
|
bool tree_insert(ptree_t head, tree_data_t data);
|
||||||
bool tree_delete(ptree_t head, tree_data_t data);
|
bool tree_delete(ptree_t head, tree_data_t data);
|
||||||
bool tree_get_min(ptree_t head, tree_data_t *data);
|
bool tree_get_min(ptree_t head, tree_data_t *data);
|
||||||
bool tree_get_max(ptree_t head, tree_data_t *data);
|
bool tree_get_max(ptree_t head, tree_data_t *data);
|
||||||
|
|
||||||
void tree_traversal_depth_preorder(ptree_t head, tree_data_disp_t tree_data_disp);
|
void tree_traversal_depth_preorder(ptree_t head, tree_data_disp_t tree_data_disp);
|
||||||
void tree_traversal_depth_inorder(ptree_t head, tree_data_disp_t tree_data_disp);
|
void tree_traversal_depth_inorder(ptree_t head, tree_data_disp_t tree_data_disp);
|
||||||
void tree_traversal_depth_postorder(ptree_t head, tree_data_disp_t tree_data_disp);
|
void tree_traversal_depth_postorder(ptree_t head, tree_data_disp_t tree_data_disp);
|
||||||
void tree_traversal_breadth(ptree_t head, tree_data_disp_t tree_data_disp);
|
void tree_traversal_breadth(ptree_t head, tree_data_disp_t tree_data_disp);
|
||||||
#endif
|
#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_
|
#endif // _TREE_H_
|
||||||
|
|
||||||
|
125
src/tree.c
125
src/tree.c
@ -1392,3 +1392,128 @@ static bool tree_rebalance(ptree_t head, ptree_node_t tree)
|
|||||||
|
|
||||||
#endif
|
#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)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user