#include <stdio.h>
#include <stdlib.h>
typedef struct _Btree {
int value;
struct _Btree *left;
struct _Btree *right;
} Btree;
void Btree_insert(Btree **node, int value)
{
Btree *b = *node;
if (b == NULL)
{
b = (Btree *)malloc(sizeof(Btree));
if(b == NULL)
{
printf("allocate memory failed\n");
return;
}
b->left = NULL;
b->right = NULL;
b->value = value;
*node = b;
}
else if (value < b->value)
{
Btree_insert(&b->left, value);
}
else
{
Btree_insert(&b->right, value);
}
}
Btree *Btree_find(Btree *node, int value)
{
if(node == NULL)
return NULL;
if(node->value == value)
return node;
else if(node->value > value)
return Btree_find(node->left, value);
else
return Btree_find(node->right, value);
}
Btree **Btree_findMin(Btree **node)
{
Btree *b = *node;
if(b->left)
return Btree_findMin(&b->left);
else
return node;
}
Btree **Btree_findMax(Btree **node)
{
Btree *b = *node;
if(b->right)
return Btree_findMax(&b->right);
else
return node;
}
void Btree_remove(Btree **node, int value)
{
Btree *b = *node;
if(b->value == value)
{
if(b->left == NULL)
{
*node = b->right;
free(b);
}
else if(b->right == NULL)
{
*node = b->left;
free(b);
}
else
{
Btree **fb = Btree_findMax(&b->left);
b->value = (*fb)->value;
Btree_remove(fb, value);
}
}
else if(b->value > value)
Btree_remove(&b->left, value);
else
Btree_remove(&b->right, value);
}
int main()
{
Btree *root = NULL;
Btree *node, **foundNode;
int element[] = {2,3,6,1,10,4,2,8,7};
int i;
for(i=0; i<sizeof(element)/sizeof(int); i++)
{
Btree_insert(&root, element[i]);
}
Btree_remove(&root, 4);
if(node = Btree_find(root, 10))
{
printf("found node->value = %d\n", node->value);
}
if(node = Btree_find(root, 4))
{
printf("found node->value = %d\n", node->value);
}
else
printf("not found\n");
Btree_insert(&root, 0);
Btree_insert(&root, 20);
Btree_remove(&root, 20);
foundNode = Btree_findMin(&root);
printf("Min node->value = %d\n", (*foundNode)->value);
foundNode = Btree_findMax(&root);
printf("Max node->value = %d\n", (*foundNode)->value);
return 0;
}
#include <stdlib.h>
typedef struct _Btree {
int value;
struct _Btree *left;
struct _Btree *right;
} Btree;
void Btree_insert(Btree **node, int value)
{
Btree *b = *node;
if (b == NULL)
{
b = (Btree *)malloc(sizeof(Btree));
if(b == NULL)
{
printf("allocate memory failed\n");
return;
}
b->left = NULL;
b->right = NULL;
b->value = value;
*node = b;
}
else if (value < b->value)
{
Btree_insert(&b->left, value);
}
else
{
Btree_insert(&b->right, value);
}
}
Btree *Btree_find(Btree *node, int value)
{
if(node == NULL)
return NULL;
if(node->value == value)
return node;
else if(node->value > value)
return Btree_find(node->left, value);
else
return Btree_find(node->right, value);
}
Btree **Btree_findMin(Btree **node)
{
Btree *b = *node;
if(b->left)
return Btree_findMin(&b->left);
else
return node;
}
Btree **Btree_findMax(Btree **node)
{
Btree *b = *node;
if(b->right)
return Btree_findMax(&b->right);
else
return node;
}
void Btree_remove(Btree **node, int value)
{
Btree *b = *node;
if(b->value == value)
{
if(b->left == NULL)
{
*node = b->right;
free(b);
}
else if(b->right == NULL)
{
*node = b->left;
free(b);
}
else
{
Btree **fb = Btree_findMax(&b->left);
b->value = (*fb)->value;
Btree_remove(fb, value);
}
}
else if(b->value > value)
Btree_remove(&b->left, value);
else
Btree_remove(&b->right, value);
}
int main()
{
Btree *root = NULL;
Btree *node, **foundNode;
int element[] = {2,3,6,1,10,4,2,8,7};
int i;
for(i=0; i<sizeof(element)/sizeof(int); i++)
{
Btree_insert(&root, element[i]);
}
Btree_remove(&root, 4);
if(node = Btree_find(root, 10))
{
printf("found node->value = %d\n", node->value);
}
if(node = Btree_find(root, 4))
{
printf("found node->value = %d\n", node->value);
}
else
printf("not found\n");
Btree_insert(&root, 0);
Btree_insert(&root, 20);
Btree_remove(&root, 20);
foundNode = Btree_findMin(&root);
printf("Min node->value = %d\n", (*foundNode)->value);
foundNode = Btree_findMax(&root);
printf("Max node->value = %d\n", (*foundNode)->value);
return 0;
}