Programowanie w C (index)


Programowanie w C (13) - drzewa binarne

ZADANIE 13.1

W katalogu domowym utworzyć podkatalog drzewa-int. Utworzyć w nim plik Makefile i pozostałe pliki, po jednym dla każdej funkcji:


/*
* main.h
*
* Plik naglowkowy - drzewa binarne.
*/

#include <stdio.h>
#include <stdlib.h>

/* typ logiczny */
typedef int bool;
#define TRUE 1
#define FALSE 0

typedef int Cargo;

/* definicja struktury */
struct btree {
    Cargo data;         /* dane elementu */
    int count;         /* licznik wystapien */
    struct btree *left;   /* wskaznik do lewego elementu */
    struct btree *right;   /* wskaznik do prawego elementu */
};

int cmp_cargo(Cargo a, Cargo b);

bool add_btree(struct btree **top_ptr, Cargo item);
/* Wstawienie elementu do drzewa */

bool find_btree(struct btree *top, Cargo item);
/* Szukanie elementu w drzewie */

void print_btree(struct btree *top);
/* Wypisanie zawartosci drzewa */

void print_indented(struct btree *top, int level);
/* Ladne rysowanie drzewa */

int count_btree(struct btree *top);
/* Zliczenie liczby wezlow w drzewie */

bool del_btree(struct btree **top_ptr, Cargo item);
/* Usuniecie elementu z drzewa */

#define is_empty(top)  ((top == NULL) ? TRUE : FALSE)
/* bool is_empty(struct btree *top); */

/*
* main.c
*/

#include "main.h"

int main(void) 
{
Cargo number = 22;   /* przykladowa liczba do sprawdzania */
/* Inicjalizujemy puste drzewo */
struct btree *root = NULL;

printf("Wielkosc drzewa: %d\n", count_btree(root));
print_indented(root, 0);

add_btree(&root, 22);
printf("Wielkosc drzewa: %d\n", count_btree(root));
print_indented(root, 0);

add_btree(&root, 11);
printf("Wielkosc drzewa: %d\n", count_btree(root));
print_indented(root, 0);

add_btree(&root,11);
printf("Wielkosc drzewa: %d\n", count_btree(root));
print_indented(root, 0);

add_btree(&root, 33);
printf("Wielkosc drzewa: %d\n", count_btree(root));
print_indented(root,0);

if (find_btree(root, number) == FALSE)
    printf("Nie znaleziono %d w drzewie\n", number);
else
    printf("Znaleziono %d w drzewie\n", number);

if (del_btree(&root, 33) == FALSE)
    printf("Nie zmniejszono drzewa\n");
else
    printf("Zmniejszono drzewo\n");
return 0;
}

/*
* add_btree.c
*
* Kod umieszczajacy w drzewie nowy element.
*/

#include "main.h"

bool add_btree(struct btree **top_ptr, Cargo item) 
{
if ((*top_ptr) == NULL) { /* pusty wezel */
    /* przydzielenie pamieci nowej strukturze */
    (*top_ptr) = malloc(sizeof(struct btree));
    if ((*top_ptr) == NULL)
        return FALSE;
    (*top_ptr)->left = NULL;
    (*top_ptr)->right = NULL;
    (*top_ptr)->count = 1;
    (*top_ptr)->data = item;   /* wstawienie liczby do pola struktury */
} else {       /* sprawdzamy, gdzie wstawic element */
    if (cmp_cargo((*top_ptr)->data, item) < 0)       /* wieksze na prawo */
        add_btree(&(*top_ptr)->right, item);
    else if (cmp_cargo((*top_ptr)->data, item) > 0)    /* mniejsze na lewo */
        add_btree(&(*top_ptr)->left, item);
    else                  /* taki element jest w drzewie */
        (*top_ptr)->count += 1; 
}
return TRUE;
}

/*
* find_btree.c
*/

#include "main.h"

bool find_btree(struct btree *top, Cargo item) 
{
bool status;

if (top == NULL)
    return FALSE;
if (cmp_cargo(top->data, item) == 0)
    return TRUE;
status = find_btree(top->left, item);
if (status == FALSE)
    status = find_btree(top->right, item);
return status;
}

/*
* print_btree.c
*/

#include "main.h"

void print_btree(struct btree *top) 
{
if (top != NULL) {
    print_btree(top->left);
    printf("%d (%d)\n", top->data, top->count);
    print_btree(top->right);
}
return;
}

/*
* print_indented.c
*/

#include "main.h"

void print_indented(struct btree *top, int level) 
{
int i;
if (top != NULL) {
    print_indented(top->left, level+1);
    for (i = 0; i < level; ++i)
        printf("   ");
    printf("%d (%d)\n", top->data, top->count);
    print_indented(top->right, level+1);
}
return;
}

/*
* count_btree.c
*/

#include "main.h"

int count_btree(struct btree *top) 
{
int counter = 0;
if (top != NULL) {
    counter += count_btree(top->left);
    ++counter;
    counter += count_btree(top->right);
}
return counter;
}

Dopisać brakujące funkcje, skompilować i uruchomić program.

ZADANIE 13.2

W katalogu domowym utworzyć podkatalog drzewa-char. Utworzyć w nim plik Makefile i pozostałe pliki, po jednym dla każdej funkcji:


/*
* main.h
*
* Plik naglowkowy.
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* typ logiczny */
typedef int bool;
#define TRUE 1
#define FALSE 0

typedef char *Cargo;

/* definicja struktury */
struct btree {
    Cargo data;    /* dane elementu */
    int count;    /* licznik wystapien */
    struct btree *left;   /* wskaznik do lewego elementu */
    struct btree *right;   /* wskaznik do prawego elementu */
};

int cmp_cargo(Cargo a, Cargo b);

bool add_btree(struct btree **top_ptr, Cargo item);
/* Wstawienie elementu do drzewa */

bool find_btree(struct btree *top, Cargo item);
/* Szukanie elementu w drzewie */

void print_btree(struct btree *top);
/* Wypisanie zawartosci drzewa */

void print_indented(struct btree *top, int level);
/* Ladne rysowanie drzewa */

int count_btree(struct btree *top);
/* Zliczenie liczby ROZNYCH elementow w drzewie */

bool del_btree(struct btree **top_ptr, Cargo item);
/* Usuniecie elementu z drzewa */

#define is_empty(top)  ((top == NULL) ? TRUE : FALSE)
/* bool is_empty(struct btree *top); */

/*
* main.c
*/

#include "main.h"

int main(void) 
{
Cargo napis = "dwa";   /* przykladowy napis do sprawdzania */
/* Inicjalizujemy puste drzewo */
struct btree *root = NULL;

printf("Wielkosc drzewa: %d\n", count_btree(root));
print_btree(root);

add_btree(&root, "jeden");
printf("Wielkosc drzewa: %d\n", count_btree(root));
print_btree(root);

add_btree(&root, "jeden");
printf("Wielkosc drzewa: %d\n", count_btree(root));
print_btree(root);

add_btree(&root, "dwa");
printf("Wielkosc drzewa: %d\n", count_btree(root));
print_btree(root);

add_btree(&root, "trzy");
printf("Wielkosc drzewa: %d\n", count_btree(root));
print_btree(root);

if (find_btree(root, napis) == FALSE)
    printf("Nie znaleziono %s w drzewie\n", napis);
else
    printf("Znaleziono %s w drzewie\n", napis);

if (del_btree(&root, napis) == FALSE)
    printf("Nie zmniejszono drzewa\n");
else
    printf("Zmniejszono drzewo\n");
print_btree(root);

return 0;
}

/*
* add_btree.c
*
* Kod umieszczajacy w drzewie nowy element.
*/

#include "main.h"

bool add_btree(struct btree **top_ptr, Cargo item) 
{
int result;   /* wynik dzialania funkcji strcmp() */
if ((*top_ptr) == NULL) {        /* pusty wezel */
    /* przydzielenie pamieci nowej strukturze */
    (*top_ptr) = malloc(sizeof(struct btree));
    if ((*top_ptr) == NULL)
        return FALSE;             /* brak pamieci */
    (*top_ptr)->left = NULL;
    (*top_ptr)->right = NULL;
    (*top_ptr)->count = 1;
    /* wstawienie  do pola struktury */
    (*top_ptr)->data = malloc((unsigned)(strlen(item)+1));
    if ((*top_ptr)->data == NULL) {
        free(*top_ptr);
        (*top_ptr) = NULL;
        return FALSE;
    } else
        strcpy((*top_ptr)->data, item);
} else {            /* sprawdzamy, gdzie wstawic element */
    result = cmp_cargo((*top_ptr)->data, item);
    if (result < 0)          /* wieksze na prawo */
        add_btree(&(*top_ptr)->right, item);
    else if (result > 0)      /* mniejsze na lewo */
        add_btree(&(*top_ptr)->left, item);
    else               /* taki element jest w drzewie */
        (*top_ptr)->count += 1;
}
return TRUE;
}

/*
* print_btree.c
*/

#include "main.h"

void print_btree(struct btree *top) 
{
if (top != NULL) {
    print_btree(top->left);
    printf("%s (%d)\n", top->data, top->count);
    print_btree(top->right);
}
return;
}

Dopisać brakujące funkcje, skompilować i uruchomić program.

ZADANIE 13.3

Napisać funkcję obliczającą wysokość drzewa binarnego.


int height_btree(struct btree *top);

ZADANIE 13.4

Napisać funkcję liczącą liście drzewa binarnego. Liście to węzły, które nie mają potomków.


int leafs_btree(struct btree *top);

ZADANIE 13.5

Napisać funkcje wypisujące zawartość drzewa w kolejności preorder (węzeł, lewe, prawe), inorder (lewe, węzeł, prawe), postorder (lewe, prawe, węzeł), poziomami.


Programowanie w C (index)