Porównanie 2 drzew bst z porządkiem

Tak jak w temacie mam do napisania funkcję, która porówna 2 drzewa z porządkiem i sprawdzi czy są takie same, tzn. czy składają się z tych samych elementów. Za bardzo nie wiem jak kto zrobić. Napisałem tylko fragment funkcji. Ktoś ma jakiś pomysł jak to napisać? Poniżej kod programu:

#include<stdio.h>
#include<stdlib.h>
 
struct elD
{
        int klucz ;
        int licznik;
         struct elD *prawy;
         struct elD *lewy;
         struct elD *ojciec;
};
 
typedef struct elD eldrzewa;
typedef eldrzewa *drzewo;
 
DodajD(drzewo *d, int klucz){
    if (*d==0)
    {
        *d=(drzewo)malloc(sizeof(eldrzewa));
        (*d)->klucz=klucz;
        (*d)->licznik=1;
        (*d)->lewy=(*d)->prawy=0;
    }
    else if (klucz<(*d)->klucz)
        DodajD(&(*d)->lewy, klucz);
    else if (klucz>(*d)->klucz)
        DodajD(&(*d)->prawy, klucz);
    else
        (*d)->licznik++;
}
 
void DDZP(drzewo d) //drukowanie drzewa z porzadkiem
{
 
    if(d->lewy!=NULL) //jezeli ma dzieci po lewej stronie wywolaj funkcje rekurencyjnie
    DDZP(d->lewy);
 
    printf("%d\n", d->klucz); //wypisz wartosc
 
    if(d->prawy!=NULL) //jezeli ma dzieci po prawej stronie wywolaj rekurencyjnie
    DDZP(d->prawy);
}
 
void Sprawdz(drzewo *d, drzewo *w) //sprawdzanie czy 2 drzewa sa takie same
{
    int x=0;
    do
    {
       if((*d)->klucz!=(*w)->klucz)
       {
           printf("Drzewa nie sa takie same");
           x=1;
       }
 
    }
    while(d!=0 && w!=0 && x!=1);
    if(x==0)
        printf("Drzewa sa takie same");
}
 
 int main() 
 {     
     int wybor;
    int liczba;
    drzewo d=0, w=0;
    int i;
 
    printf("[1] Dodanie do pierwszego drzewa\n");
    printf("[2] Wyswietlenie pierwszego drzewa\n");
    printf("[3] Dodanie do drugiego drzewa\n");
    printf("[4] Wyswietlenie drugiego drzewa\n");
    printf("[5] Sprawdzenie czy 2 drzewa sa takie same?\n");
    printf("[6] Wyjscie\n");
    do{
    printf("Wybierz: ");
    scanf("%d", &wybor);
    switch(wybor)
        {
        case 1:
            printf("Dodanie do pierwszego drzewa\n");
            printf("Podaj liczbe: ");
            scanf("%d", &liczba);
            DodajD(&d, liczba);
            printf("\n");
        break;
        case 2:
            printf("Wyswietlenie pierwszego drzewa\n");
               DDZP(d);
            printf("\n");
           break;
           case 3:
            printf("Dodanie do drugiego drzewa\n");
               printf("Podaj liczbe: ");
            scanf("%d", &liczba);
            DodajD(&w, liczba);
            printf("\n");
           break;
 
        case 4:
            printf("Wyswietlenie drugiego drzewa\n");
            DDZP(w);
            printf("\n");
        break;
        case 5:
            printf("Sprawdzenie czy 2 drzewa sa takie same?\n");
            Sprawdz(&d, &w);
            printf("\n");
        break;
        break;
        case 6:
            printf("Wyszedłes z programu!");
            return 0;
        break;
    }
    }while( wybor>=1 );
 
    return 0;
}

Paczam na to i nie wiem o co chodzi …

Zacznijmy od tego:

typedef struct elD eldrzewa;
typedef eldrzewa *drzewo;

po co Ci to? Przecież to zaciemnianie kodu, przez te linijki w kodzie używasz nazw elD, eldrzewa i drzewo które oznaczają to samo. Sorki ale dla mnie to lekka pomyłka - jeśli to ma jakiś sens prosiłbym o uzasadnienie bo specem od C nie jestem i może nie mam racji. Jeśli tak jest to proszę o uzasadnienie dlaczego tak robisz.

Kolejna sprawa:

struct elD
{
        int klucz ;
        int licznik;
         struct elD *prawy;
         struct elD *lewy;
         struct elD *ojciec;
};

Co to jest klucz, licznik i ojciec (którego nie używasz w kodzie ani raz)? Do tej pory myślałem że liście w drzewie bst składają się z 3 elementów - lewy_lisc, wartosc, prawy_lisc. Po co reszta nie wiem, nazewnictwo nieintuicyjne bo nic nie mówi.

Znów

DodajD(drzewo *d, int klucz){
    if (*d==0)
    {
        *d=(drzewo)malloc(sizeof(eldrzewa));
        (*d)->klucz=klucz;
        (*d)->licznik=1;
        (*d)->lewy=(*d)->prawy=0;
    }
    else if (klucz<(*d)->klucz)
        DodajD(&(*d)->lewy, klucz);
    else if (klucz>(*d)->klucz)
        DodajD(&(*d)->prawy, klucz);
    else
        (*d)->licznik++;
}

nazewnictwo, nie dodajesz drzewa do drzewa tylko element ewentualnie liść do drzewa. Poza tym nie rozumiem działania tej funkcji, w ogóle ona spełnia swoją funkcję? W sumie może i działa, ale jest strasznie skomplikowana.

Jeśli o pytanie chodzi:

Gdy masz dwa drzewa A i B zaczynasz od najmniejszego musisz przeiterować (przejść w pętli) po każdym elemencie drzewa A, np. od najmniejszego elementu i na drzewie B wywołać funkcję która będzie sprawdzała czy dany element znajduje się w drzewie. Funkcja musi zwracać true i false, jeśli funkcja zwróci false przerywasz iterowanie drzewa A i zwracasz false bo drzewa nie są identyczne, jeśli funckja sprawdzająca istnienie elementów w drzewie nigdy nie zwróci true i rozmiary drzew się zgadzają zwracasz true. Dla tej funkcji porównującej możesz nawet na samym początku porównać rozmiar drzew, jeśli są różne (jedno ma 7 elementów, a drugie 12) to drzewa są różne i zwracasz false - taki zabieg optymalizacyjny dla konkretnego przypadku.

Funkcję sprawdzającą czy element jest w drzewie musisz sobie dopisać, będzie ona szybko działała bo drzewa są strukturą którą szybko się przeszukuje i będzie podobna do tej co dodaje, czyli sprawdzasz czy wartość jest większa lub mniejsza od korzenia i lecisz w prawo lub w lewo i rekurencyjnie wywołujesz tą samą funkcję na lewym lub prawym elemencie. Jeśli znajdziesz element zwracasz true, jeśli masz ostatni liść i np twoja szukana wartość jest większa lub mniejsza od niego a on nie ma potomków - kolejnych liści na lewo lub prawo - zależnie od tego czy szukana wartość jest większa lub mniejsza to zwracasz false.

Reasumując więcej napisałem tekstu tutaj tłumacząc Ci to niż ty masz do napisania kodu.

 

EDIT:

Drzewo jest typowo obiektową strukturą, ale ponieważ ty używasz C to musisz zastosować podejście ala obiektowe - czyli dopisać funkcje takie typowe dla klass - obiektów znanych np z C++. Czyli jakiś createTree - konstruktor oraz deleteTree - destruktor.

Gdy będziesz miał takie funkcje uprości ci się znacząco cały kod.

Tak, jak napisał kolega wyżej oraz co już pisałem w twoim poprzednim pytaniu (http://forum.dobreprogramy.pl/c-lista-dwukierunkowa-cykliczna-szukanie-520461t.html). Zaciemniasz kod tymi typedef-ami.