Problem z usuwaniem drzewa binarnego

0

Witam, mam za zadanie zrobić drzewo binarne oraz podstawowe działania na nim typu: dodawanie elementu, wypisanie drzewa, usuwanie węzła, usuwanie całego drzewa i właśnie przy usuwaniu całego drzewa visual wyrzuca mi error, coś o przepełnieniu stosu chyba i nie mam pojęcia jak temu zaradzić :/ Pisze w języku C.

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

typedef struct Drzewo_	//struktura drzewa
{
	int wartosc;
	struct Drzewo_ *Prawy;
	struct Drzewo_ *Lewy;
} Drzewo;

Drzewo* dodawanie(int n, Drzewo **korzen);	//deklaracja funkcji dodajaca elementy do drzewa
Drzewo* szukaj(Drzewo* korzen, int wartosc);	// deklaracja funkcji szukajacej dany wezel i zwracajacy go lub null gdy nie istnieje
void wypiszDrzewo(Drzewo *korzen); // deklaracja funkcji wypisującej drzewo
void usuwanieDrzewa(Drzewo *korzen);

 

int main()
{
	Drzewo *poczatek = NULL;
	Drzewo *wezel = NULL;

	wypiszDrzewo(poczatek);

	printf("Wypisanie drzewa:\n");
	dodawanie(20, &poczatek);
	dodawanie(5, &poczatek);
	dodawanie(10, &poczatek);
	dodawanie(15, &poczatek);
	dodawanie(2, &poczatek);
	dodawanie(30, &poczatek);
	dodawanie(25, &poczatek);
	wypiszDrzewo(poczatek);
	dodawanie(6, &poczatek);
	dodawanie(16, &poczatek);
	
	printf("\nDrugie wypisanie drzewa:\n");
	wypiszDrzewo(poczatek);
	
	printf("\nZwracamy podany element drzewa: \n");
	wezel = szukaj(poczatek, 10);
	printf("%d\n\n", *wezel);
	
	//usuwanieDrzewa(poczatek);
	
	dodawanie(123, &poczatek);
	wypiszDrzewo(poczatek);
	
	return 0;
}

Drzewo* dodawanie(int n, Drzewo **korzen)
{ //jezeli drzewo jest puste to dodaj korzen
	if ((*korzen) == NULL)
		{
			(*korzen) = (Drzewo*)malloc(sizeof (*korzen)); 
			(*korzen)->wartosc = n;
			(*korzen)->Prawy = NULL;
			(*korzen)->Lewy = NULL;
		}
	//jezeli zadana wartosc jest mniejsza od korzenia idz do lewego poddrzewa
	else if(n < (*korzen)->wartosc)
		{		//jezeli lewe poddrzewo istnieje wywolaj dla niego ta funkcje rekurencyjnie
			if((*korzen)->Lewy != NULL)
				{
					dodawanie(n, &((**korzen).Lewy));
				}
			else
				{
					Drzewo *nowy = (Drzewo*)malloc(sizeof (*korzen));
					nowy->wartosc = n;
					nowy->Lewy = NULL;
					nowy->Prawy = NULL;
					(*korzen)->Lewy=nowy;
				}
			}
		//jezeli zadana wartosc jest wieksza lub rowna korzeniowi idz do prawego poddrzewa   
		else
			{
					//jezeli prawe poddrzewo istnieje wywolaj dla niego ta funkcje rekurencyjnie      
				if((*korzen)->Prawy != NULL)
					{
						dodawanie(n , &((**korzen).Prawy));
					}
					//jezeli prawe poddrzewo nie istnieje dodaj nowy wezel o zadanej wartosci     
				else
					{
						Drzewo *nowy = (Drzewo*)malloc(sizeof (*korzen));
						nowy->wartosc = n;
						nowy->Lewy = NULL;
						nowy->Prawy = NULL;
						(*korzen)->Prawy=nowy;
					}
			}
return *korzen;
} 

Drzewo* szukaj(Drzewo* korzen, int wartosc)
{
	if (korzen->wartosc == wartosc) return korzen;
	else if (wartosc < korzen->wartosc && korzen->Lewy != NULL) return szukaj(korzen->Lewy, wartosc);
	else if (wartosc > korzen->wartosc && korzen->Prawy != NULL) return szukaj(korzen->Prawy, wartosc);
	return NULL;
}

void wypiszDrzewo(Drzewo *korzen)
{
	//if(korzen->Lewy != NULL) //jezeli ma dzieci po lewej stronie wywolaj funkcje rekurencyjnie
	if(korzen != NULL){	
	wypiszDrzewo(korzen->Lewy);
 
	printf("%d\n", korzen->wartosc); //wypisz wartosc
	wypiszDrzewo(korzen->Prawy);
	}
	return;
 
	//if(korzen->Prawy != NULL) //jezeli ma dzieci po prawej stronie wywolaj rekurencyjnie
		//wypiszDrzewo(korzen->Prawy);
}

void usuwanieDrzewa(Drzewo *korzen)
{
	Drzewo* temp;

    if (korzen != NULL)
    {
        temp = korzen;
		usuwanieDrzewa(korzen->Lewy);
        usuwanieDrzewa(korzen->Prawy);
        free(temp);
    }
}

A tutaj error jaki mi się pojawia:
user image

0

Zapewne niepoprawnie zwalniasz pamięć albo piszesz po nie swojej pamięci. Włącz debuger i zobacz krok po kroku co się dzieje. Nikt tego za ciebie nie zrobi.

0

Debuger mi tu niestety wiele nie mówi, dlatego piszę na forum z założeniem, że uda się znaleźć błąd jaki tu popełniam, gdyż sam nie wiem...

0
Infinito napisał(a):

To jakieś porady jak miałoby wyglądać to dodawanie?

Jakkolwiek byle po ludzku, np tak:

void dodawanie(int n,Drzewo **korzen)
  {
   if(*korzen) dodawanie(n,n<(*korzen)->wartosc?&((*korzen)->Lewy):&((*korzen)->Prawy));
   else
     {
      (*korzen)=(Drzewo*)malloc(sizeof(Drzewo)); 
      (*korzen)->wartosc=n;
      (*korzen)->Prawy=(*korzen)->Lewy=NULL;
     }
  }

Szukanie również spaprane.
Usuwanie zrobione tak że po nim trzeba wpisać poczatek=NULL; zanim zaczniesz dodawać no i ma zbędne instrukcje.
Wyświetlanie ma tylko jedną zbędną instrukcje - return;

0

Dziękuję za porady, zabieram się do przerabiania kodu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1