[每日练习]C编程实现二叉树

来源:互联网 发布:mac cs6破解方法 编辑:程序博客网 时间:2024/04/30 19:22
#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;
}
0 0
原创粉丝点击