|
@@ -4,7 +4,7 @@
|
|
|
extern func_malloc ds_malloc;
|
|
extern func_malloc ds_malloc;
|
|
|
extern func_free ds_free;
|
|
extern func_free ds_free;
|
|
|
|
|
|
|
|
-ds_bitree_t* ds_bitree_init(func_destroyer destroyer)
|
|
|
|
|
|
|
+ds_bitree_t* ds_bitree_new(func_destroyer destroyer)
|
|
|
{
|
|
{
|
|
|
ds_bitree_t* tree = (ds_bitree_t*)ds_malloc(sizeof(ds_bitree_t));
|
|
ds_bitree_t* tree = (ds_bitree_t*)ds_malloc(sizeof(ds_bitree_t));
|
|
|
if (!tree) {
|
|
if (!tree) {
|
|
@@ -12,24 +12,32 @@ ds_bitree_t* ds_bitree_init(func_destroyer destroyer)
|
|
|
}
|
|
}
|
|
|
tree->size = 0;
|
|
tree->size = 0;
|
|
|
tree->root = NULL;
|
|
tree->root = NULL;
|
|
|
- tree->destroyer = destroyer;
|
|
|
|
|
- tree->comparer = NULL;
|
|
|
|
|
|
|
+ tree->destroyer = destroyer ? destroyer : ds_cb_default_destroyer;
|
|
|
return tree;
|
|
return tree;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-void ds_bitree_destroy(ds_bitree_t* tree)
|
|
|
|
|
|
|
+int ds_bitree_init(ds_bitree_t* tree, func_destroyer destroyer)
|
|
|
|
|
+{
|
|
|
|
|
+ tree->size = 0;
|
|
|
|
|
+ tree->root = NULL;
|
|
|
|
|
+ tree->destroyer = destroyer ? destroyer : ds_cb_default_destroyer;
|
|
|
|
|
+
|
|
|
|
|
+ return DS_ERR_OK;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void ds_bitree_destroy(ds_bitree_t* tree, int free_tree)
|
|
|
{
|
|
{
|
|
|
ds_bitree_rm_left(tree, NULL);
|
|
ds_bitree_rm_left(tree, NULL);
|
|
|
|
|
|
|
|
- ds_free(tree);
|
|
|
|
|
- tree = NULL;
|
|
|
|
|
|
|
+ if (free_tree)
|
|
|
|
|
+ ds_free(tree);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-int ds_bitree_ins_left(ds_bitree_t* tree, ds_bitree_node_t* node, ds_data_t data)
|
|
|
|
|
|
|
+int ds_bitree_ins_left(ds_bitree_t* tree, ds_binode_t* node, ds_data_t data)
|
|
|
{
|
|
{
|
|
|
- ds_bitree_node_t * new_node, **pos;
|
|
|
|
|
|
|
+ ds_binode_t * new_node, **pos;
|
|
|
if (!node) {
|
|
if (!node) {
|
|
|
- if (ds_bitree_size(tree) > 0) {
|
|
|
|
|
|
|
+ if (ds_bitree_size(tree) > 0) { // has root already
|
|
|
return DS_ERR_PARAMS;
|
|
return DS_ERR_PARAMS;
|
|
|
}
|
|
}
|
|
|
pos = &(tree->root);
|
|
pos = &(tree->root);
|
|
@@ -39,7 +47,7 @@ int ds_bitree_ins_left(ds_bitree_t* tree, ds_bitree_node_t* node, ds_data_t data
|
|
|
}
|
|
}
|
|
|
pos = &(node->left);
|
|
pos = &(node->left);
|
|
|
}
|
|
}
|
|
|
- if((new_node = (ds_bitree_node_t*)ds_malloc(sizeof(ds_bitree_node_t))) == NULL) {
|
|
|
|
|
|
|
+ if ((new_node = (ds_binode_t*)ds_malloc(sizeof(ds_binode_t))) == NULL) {
|
|
|
return DS_ERR_MEM;
|
|
return DS_ERR_MEM;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -53,9 +61,9 @@ int ds_bitree_ins_left(ds_bitree_t* tree, ds_bitree_node_t* node, ds_data_t data
|
|
|
return DS_ERR_OK;
|
|
return DS_ERR_OK;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-int ds_bitree_ins_right(ds_bitree_t* tree, ds_bitree_node_t* node, ds_data_t data)
|
|
|
|
|
|
|
+int ds_bitree_ins_right(ds_bitree_t* tree, ds_binode_t* node, ds_data_t data)
|
|
|
{
|
|
{
|
|
|
- ds_bitree_node_t * new_node, **pos;
|
|
|
|
|
|
|
+ ds_binode_t * new_node, **pos;
|
|
|
if (!node) {
|
|
if (!node) {
|
|
|
if (ds_bitree_size(tree) > 0) {
|
|
if (ds_bitree_size(tree) > 0) {
|
|
|
return DS_ERR_PARAMS;
|
|
return DS_ERR_PARAMS;
|
|
@@ -67,7 +75,7 @@ int ds_bitree_ins_right(ds_bitree_t* tree, ds_bitree_node_t* node, ds_data_t dat
|
|
|
}
|
|
}
|
|
|
pos = &(node->right);
|
|
pos = &(node->right);
|
|
|
}
|
|
}
|
|
|
- if((new_node = (ds_bitree_node_t*)ds_malloc(sizeof(ds_bitree_node_t))) == NULL) {
|
|
|
|
|
|
|
+ if((new_node = (ds_binode_t*)ds_malloc(sizeof(ds_binode_t))) == NULL) {
|
|
|
return DS_ERR_MEM;
|
|
return DS_ERR_MEM;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -81,9 +89,9 @@ int ds_bitree_ins_right(ds_bitree_t* tree, ds_bitree_node_t* node, ds_data_t dat
|
|
|
return DS_ERR_OK;
|
|
return DS_ERR_OK;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-int ds_bitree_rm_left(ds_bitree_t* tree, ds_bitree_node_t* node)
|
|
|
|
|
|
|
+int ds_bitree_rm_left(ds_bitree_t* tree, ds_binode_t* node)
|
|
|
{
|
|
{
|
|
|
- ds_bitree_node_t ** pos;
|
|
|
|
|
|
|
+ ds_binode_t ** pos;
|
|
|
if (ds_bitree_size(tree) <= 0) {
|
|
if (ds_bitree_size(tree) <= 0) {
|
|
|
return DS_ERR_EMPTY;
|
|
return DS_ERR_EMPTY;
|
|
|
}
|
|
}
|
|
@@ -97,10 +105,8 @@ int ds_bitree_rm_left(ds_bitree_t* tree, ds_bitree_node_t* node)
|
|
|
ds_bitree_rm_left(tree, *pos);
|
|
ds_bitree_rm_left(tree, *pos);
|
|
|
ds_bitree_rm_right(tree, *pos);
|
|
ds_bitree_rm_right(tree, *pos);
|
|
|
|
|
|
|
|
- if(tree->destroyer) {
|
|
|
|
|
- tree->destroyer((*pos)->data);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
|
|
+ tree->destroyer((*pos)->data);
|
|
|
|
|
+
|
|
|
ds_free(*pos);
|
|
ds_free(*pos);
|
|
|
*pos = NULL;
|
|
*pos = NULL;
|
|
|
|
|
|
|
@@ -109,9 +115,9 @@ int ds_bitree_rm_left(ds_bitree_t* tree, ds_bitree_node_t* node)
|
|
|
return DS_ERR_OK;
|
|
return DS_ERR_OK;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-int ds_bitree_rm_right(ds_bitree_t* tree, ds_bitree_node_t* node)
|
|
|
|
|
|
|
+int ds_bitree_rm_right(ds_bitree_t* tree, ds_binode_t* node)
|
|
|
{
|
|
{
|
|
|
- ds_bitree_node_t**pos;
|
|
|
|
|
|
|
+ ds_binode_t **pos;
|
|
|
if (ds_bitree_size(tree) <= 0){
|
|
if (ds_bitree_size(tree) <= 0){
|
|
|
return DS_ERR_EMPTY;
|
|
return DS_ERR_EMPTY;
|
|
|
}
|
|
}
|
|
@@ -125,13 +131,11 @@ int ds_bitree_rm_right(ds_bitree_t* tree, ds_bitree_node_t* node)
|
|
|
ds_bitree_rm_left(tree, *pos);
|
|
ds_bitree_rm_left(tree, *pos);
|
|
|
ds_bitree_rm_right(tree, *pos);
|
|
ds_bitree_rm_right(tree, *pos);
|
|
|
|
|
|
|
|
- if(tree->destroyer){
|
|
|
|
|
- tree->destroyer((*pos)->data);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ tree->destroyer((*pos)->data);
|
|
|
|
|
|
|
|
ds_free(*pos);
|
|
ds_free(*pos);
|
|
|
*pos = NULL;
|
|
*pos = NULL;
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
tree->size--;
|
|
tree->size--;
|
|
|
}
|
|
}
|
|
|
return DS_ERR_OK;
|
|
return DS_ERR_OK;
|
|
@@ -139,13 +143,13 @@ int ds_bitree_rm_right(ds_bitree_t* tree, ds_bitree_node_t* node)
|
|
|
|
|
|
|
|
ds_bitree_t* ds_bitree_merge(ds_bitree_t*left, ds_bitree_t*right, ds_data_t data)
|
|
ds_bitree_t* ds_bitree_merge(ds_bitree_t*left, ds_bitree_t*right, ds_data_t data)
|
|
|
{
|
|
{
|
|
|
- ds_bitree_t *new_tree = ds_bitree_init(left->destroyer);
|
|
|
|
|
|
|
+ ds_bitree_t *new_tree = ds_bitree_new(left->destroyer);
|
|
|
if(!new_tree) {
|
|
if(!new_tree) {
|
|
|
return NULL;
|
|
return NULL;
|
|
|
}
|
|
}
|
|
|
int err;
|
|
int err;
|
|
|
if((err = ds_bitree_ins_left(new_tree, NULL, data)) != DS_ERR_OK) {
|
|
if((err = ds_bitree_ins_left(new_tree, NULL, data)) != DS_ERR_OK) {
|
|
|
- ds_bitree_destroy(new_tree);
|
|
|
|
|
|
|
+ ds_bitree_destroy(new_tree, 1);
|
|
|
return NULL;
|
|
return NULL;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -160,7 +164,7 @@ ds_bitree_t* ds_bitree_merge(ds_bitree_t*left, ds_bitree_t*right, ds_data_t data
|
|
|
return new_tree;
|
|
return new_tree;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-void ds_bitree_preorder(ds_bitree_node_t* node, func_each each)
|
|
|
|
|
|
|
+void ds_bitree_preorder(ds_binode_t* node, func_each each)
|
|
|
{
|
|
{
|
|
|
if(node){
|
|
if(node){
|
|
|
if(each){
|
|
if(each){
|
|
@@ -171,7 +175,7 @@ void ds_bitree_preorder(ds_bitree_node_t* node, func_each each)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-void ds_bitree_inorder(ds_bitree_node_t* node, func_each each)
|
|
|
|
|
|
|
+void ds_bitree_inorder(ds_binode_t* node, func_each each)
|
|
|
{
|
|
{
|
|
|
if(node) {
|
|
if(node) {
|
|
|
ds_bitree_inorder(node->left, each);
|
|
ds_bitree_inorder(node->left, each);
|
|
@@ -182,7 +186,7 @@ void ds_bitree_inorder(ds_bitree_node_t* node, func_each each)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-void ds_bitree_postorder(ds_bitree_node_t* node, func_each each)
|
|
|
|
|
|
|
+void ds_bitree_postorder(ds_binode_t* node, func_each each)
|
|
|
{
|
|
{
|
|
|
if(node) {
|
|
if(node) {
|
|
|
ds_bitree_postorder(node->left, each);
|
|
ds_bitree_postorder(node->left, each);
|