unicstl/include/tree.h

156 lines
4.2 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @file tree.h
* @author wenjf (Orig5826@163.com)
* @brief
* @version 0.1
* @date 2024-06-23
*
* @copyright Copyright (c) 2024
*
*/
#ifndef _TREE_H_
#define _TREE_H_
#include "common.h"
#if AVLTREE == 1 || RAVLTREE == 1
// typedef int tree_data_t;
typedef struct _tree_node_t
{
tree_data_t data;
struct _tree_node_t * left;
struct _tree_node_t * right;
struct _tree_node_t * parent;
int32_t balance; // balance of avl tree
}tree_node_t, *ptree_node_t;
typedef struct _tree_t
{
struct _tree_node_t * tree;
uint32_t size;
}tree_t, *ptree_t;
typedef void (*tree_data_disp_t)(tree_data_t data);
#endif
#if RAVLTREE == 1
bool tree_init(ptree_node_t *head);
void tree_destroy(ptree_node_t *head);
bool tree_empty(ptree_node_t head);
void tree_clear(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_delete(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);
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_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);
#endif
#if AVLTREE == 1
bool tree_init(ptree_t *head);
void tree_destroy(ptree_t *head);
bool tree_empty(ptree_t head);
void tree_clear(ptree_t head);
uint32_t tree_get_size(ptree_t head);
bool tree_insert(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_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_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_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;
};
};
struct _tree
{
struct _tree_node * _root;
uint32_t _size; // ջ<><D5BB>С
uint32_t _obj_size; // Ԫ<>ش<EFBFBD>С
uint32_t _capacity; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint32_t _ratio; // <20><>չ<EFBFBD><D5B9><EFBFBD><EFBFBD>
bool _right_priority; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// kernel
bool (*insert)(struct _tree* self, void* obj);
bool (*delete)(struct _tree* self, void* obj);
struct _tree_node* (*find)(struct _tree* self, void* obj);
struct _tree_node* (*find_min)(struct _tree* self, struct _tree_node* root);
struct _tree_node* (*find_max)(struct _tree* self, struct _tree_node* root);
bool (*rebalance)(struct _tree* self, struct _tree_node* root);
uint32_t (*height)(struct _tree* self, struct _tree_node* root);
bool (*min)(struct _tree* self, void** obj);
bool (*max)(struct _tree* self, void** obj);
bool (*clear)(struct _tree* self);
bool (*empty)(struct _tree* self);
uint32_t (*size)(struct _tree* self);
/**
* @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
void (*destory)(struct _tree* self);
// ----- print -----
// traversal depth
void (*order)(struct _tree* self, bool right_priority);
void (*preorder)(struct _tree* self, struct _tree_node* root);
void (*inorder)(struct _tree* self, struct _tree_node* root);
void (*postorder)(struct _tree* self, struct _tree_node* root);
// traversal breadth
void (*breadth)(struct _tree* self, struct _tree_node* root);
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_