Ahoj, potřebovala bych poradit s kouskem kódu. Nevím, jak na to. Jedná se o část, kde se mají smazat uzly binárního stromu.. Je u toho napsáno //úkol... Ještě bych chtěla, kdyby mi někdo zkontroloval, zda jsem správně udělala smazání celého stromu. Moc děkuji.
//ADT binární strom
//Podle prednasek implementujte ADT binární strom, který bude bude poskytovat následující metody
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
//pomocna struktura pro definici prvku ukladaneho do stromu
typedef struct tDatatag
{
int Key;
}tData;
typedef struct tUzelStromutag
{
tData data; //ukladana data
struct tUzelStromutag* ukLevy; //ukazatel na leveho nasledovnika
struct tUzelStromutag* ukPravy; //ukazatel na praveho nasledovnika
}tUzelStromu;
typedef tUzelStromu* tUkUzel; //tUzelStromu* tUkUzel;
//pomocna funkce pro vypis dat
void writedata(tData* d)
{
printf("(%d)", d->Key);
}
//vlo?í do stromu nový uzel s daty d. Pokud uz ve stromu existuje strom se stejnými daty, neudilá nic
void BSTInsert(tUkUzel* RootPtr, tData* d)
{
if( (*RootPtr) != NULL )
{
if( d->Key < (*RootPtr)->data.Key )
BSTInsert(&(*RootPtr)->ukLevy, d);
else if( d->Key > (*RootPtr)->data.Key )
BSTInsert(&(*RootPtr)->ukPravy, d);
else
(*RootPtr)->data.Key = d->Key;
}
else
{
(*RootPtr) = (tUkUzel)malloc(sizeof(tUzelStromu)); //vytvooení nového uzlu
(*RootPtr)->ukLevy = NULL; //a jeho naplniní správnými hodnotami}
(*RootPtr)->ukPravy = NULL;
(*RootPtr)->data.Key = d->Key;
}
}
//vyhledá uzel, jeho? data jsou shodná jako parametr d
tUkUzel BSTSearch(tUkUzel RootPtr, tData* d)
{
if( RootPtr != NULL )
{
if( d->Key < RootPtr->data.Key )
return BSTSearch(RootPtr->ukLevy, d);
else if( d->Key > RootPtr->data.Key )
return BSTSearch(RootPtr->ukPravy, d);
else
return RootPtr;
}
else
return NULL;
}
//projde strom pruchodem preorder a vytiskne v?echny jeho uzly
void BSTPreorder(tUkUzel uzel)
{
if( uzel != NULL )
{
writedata(&uzel->data);
BSTPreorder( uzel->ukLevy );
BSTPreorder( uzel->ukPravy );
}
}
//projde strom pruchodem inorder a vytiskne v?echny jeho uzly
void BSTInorder(tUkUzel uzel)
{
if( uzel != NULL )
{
BSTInorder( uzel->ukLevy );
writedata(&uzel->data);
BSTInorder( uzel->ukPravy );
}
}
//projde strom pruchodem postorder a vytiskne v?echny jeho uzly
void BSTPostorder(tUkUzel uzel)
{
if( uzel != NULL )
{
BSTPostorder( uzel->ukLevy );
BSTPostorder( uzel->ukPravy );
writedata(&uzel->data);
}
}
//korektni ze stromu sma?e uzel, jeho? data jsou stejné jako parametr d
void BSTDelete(tUkUzel RootPtr, tData* d)
{
//ukol
}
//sma?e celý strom
void BSTDeleteTree(tUkUzel RootPtr)
{
if (RootPtr != NULL)
{
BSTDeleteTree(RootPtr->ukLevy);
BSTDeleteTree(RootPtr->ukPravy);
RootPtr = NULL;
}
}
int main()
{
tUkUzel strom = NULL;
tData data;
int i;
srand( (unsigned)time( NULL ) );
printf("\nVkladam nahodne cislo: ");
for(i=0; i<5; i++)
{
data.Key = rand()%50;
BSTInsert(&strom, &data);
printf("%d ", data.Key);
}
data.Key = 25;
BSTInsert(&strom, &data);
printf("%d ", data.Key);
for(i=0; i<5; i++)
{
data.Key = rand()%50;
BSTInsert(&strom, &data);
printf("%d ", data.Key);
}
printf("\nVypis stromu metodou inorder:\n");
BSTInorder(strom);
printf("\nVypis stromu metodou preorder:\n");
BSTPreorder(strom);
printf("\nVypis stromu metodou postorder:\n");
BSTPostorder(strom);
data.Key = 25;
BSTDelete(strom, &data);
printf("\nVypis stromu metodou inorder po smazani prvku %d:\n", data.Key);
BSTInorder(strom);
BSTDeleteTree(strom);
printf("\nVypis stromu metodou inorder po smazani vsech prvku:\n");
BSTInorder(strom);
printf("\nLibovolnou klavesou ukoncete program.");
getch();
return 0;
}