Program działa jak należy aż do ostatniej wywoływanej funkcji, powinien usunąć element o wartości klucza k4, a jednak program twierdzi że nie znajduje szukanego elementu
#include <iostream>
#include <cstdlib>
#include <time.h>
#include <fstream>
using namespace std;
//----------------ZMIENNE----------------//
int tab[101], X, k1, k2, k3, k4, licznik = 0;
struct wezel {
int klucz;
char klucz2[10];
wezel * lewy;
wezel * prawy;
wezel * ojciec;
};
struct drzewo{
wezel * korzen = NULL;
}drzewo;
//----------------FUNKCJE----------------//
void odczyt_pliku(){
fstream plik;
plik.open("inlab03.txt", ios::in);
if(plik.good()==false){
cout<<"Nie udalo sie odczytac pliku lub plik nie istnieje";
exit(0);
}
plik>>X>>k1>>k2>>k3>>k4;
plik.close();
};
int losuj_int(){
int wylosowana;
int j;
do
{
wylosowana = rand() % 20000 - 10000;
for(j = 0; j < licznik; ++j)
{
if(wylosowana == tab[j]) break;
}
}
while(j != licznik);
tab[licznik++] = wylosowana;
return wylosowana;
};
void dodaj_wezel(int k){
wezel * wez = drzewo.korzen;
wezel * nowy = new wezel;
nowy->lewy = NULL;
nowy->prawy = NULL;
nowy->klucz = k;
if(drzewo.korzen==NULL) {
drzewo.korzen = nowy;
}
else{
while(true){
if(k < wez->klucz)
{
if(!wez->lewy)
{
wez->lewy = nowy;
break;
}
else {
wez = wez->lewy;
}
}
if (k > wez->klucz)
{
if(!wez->prawy) // Jeśli prawego syna nie ma,
{
wez->prawy = nowy; // to węzeł w staje się prawym synem
break; // Przerywamy pętlę while
}
else {
wez = wez->prawy;
}
}
}
nowy->ojciec = wez;
}
}
void dodaj_x_wezlow(int X){
for (int i = 0; i<=X; i++){
wezel * wez = drzewo.korzen;
wezel * nowy = new wezel;
nowy->lewy = NULL;
nowy->prawy = NULL;
int k = losuj_int();
nowy->klucz = k;
if(!wez) {
drzewo.korzen = nowy;
}
else{
while(true){
if(k < wez->klucz)
{
if(!wez->lewy)
{
wez->lewy = nowy;
break;
}
else {
wez = wez->lewy;
}
}
if (k > wez->klucz)
{
if(!wez->prawy)
{
wez->prawy = nowy;
break;
}
else {
wez = wez->prawy;
}
}
}
}
nowy->ojciec = wez;
}
};
wezel * najmniejszy(wezel * wez){
while (wez->lewy != NULL){
wez = wez->lewy;
}
return wez;
}
wezel * nastepnik(wezel * wez){
wezel * wez2;
if (wez->prawy != NULL){
while (wez->lewy != NULL){
wez = wez->lewy;
}
return wez;
}
wez2 = wez->ojciec;
while ((wez2 != wez) && (wez2->lewy != wez)){
wez = wez2;
wez2 = wez2->ojciec;
}
return wez2;
}
void usun(int k){
wezel * wsk = drzewo.korzen;
wezel * wsk2;
wezel * wsk3;
int pozycja = 1;
if(drzewo.korzen==NULL){
cout<<endl<<"Wezel ktory chcesz usunac nie istnieje - drzewo jest puste!"<<endl;
return;
}
else{
while((drzewo.korzen!=NULL) && (wsk->klucz != k)){//szukaj porownania
if(k < wsk->klucz){
if(wsk->lewy != NULL){
wsk = wsk->lewy;
pozycja = pozycja*2;
}
else{
cout<<endl<<"Nie znaleziono szukanego wezla"<<endl;
return;
}
}
else if (k > wsk->klucz){
if(wsk->prawy != NULL){
wsk = wsk->prawy;
pozycja = (pozycja*2)+1;
}
else{
cout<<endl<<"Nie znaleziono szukanego wezla"<<endl;
return;
}
}
}
if((wsk->lewy==NULL)||(wsk->prawy==NULL)){
wsk2=wsk;
}
else{
wsk2=nastepnik(wsk);
}
if(wsk->lewy != NULL){
wsk3=wsk2->lewy;
}
else{
wsk3=wsk2->prawy;
}
if(wsk3!=NULL){
wsk3->ojciec = wsk2->ojciec;
}
if(wsk2->ojciec == NULL){
drzewo.korzen = wsk3;
}
else{
if (wsk2 == wsk2->ojciec->lewy){
wsk2->ojciec->lewy = wsk3;
}
else{
wsk2->ojciec->prawy = wsk3;
}
}
if(wsk2 != wsk){
wsk->klucz = wsk2->klucz;
//wsk->klucz2 = wsk2->klucz2;
}
}
}
void wyszukaj(int k){
int pozycja = 1;
wezel * wez = drzewo.korzen;
while((drzewo.korzen!=NULL) && (wez->klucz != k)){//szukaj porownania
if(k < wez->klucz){
if(wez->lewy != NULL){
wez = wez->lewy;
pozycja = pozycja*2;
}
else{
cout<<endl<<"Nie znaleziono szukanego wezla"<<endl;
return;
}
}
else if (k > wez->klucz){
if(wez->prawy != NULL){
wez = wez->prawy;
pozycja = (pozycja*2)+1;
}
else{
cout<<endl<<"Nie znaleziono szukanego wezla"<<endl;
return;
}
}
}
cout<<endl<<"Szukany wezel znajduje sie na pozycji "<<pozycja<<endl;
};
void in_order(wezel * wsk){
if(wsk != NULL){
in_order(wsk->lewy);
cout<<wsk->klucz<<" ";
in_order(wsk->prawy);
}
};
void pre_order(wezel * wsk){
if(wsk != NULL)
{
cout<<wsk->klucz<<" "; // odwiedzamy węzeł
pre_order(wsk->lewy); // przechodzimy lewe poddrzewo
pre_order(wsk->prawy); // przechodzimy prawe poddrzewo
}
};
void post_order(wezel * wsk){
if(wsk != NULL)
{
post_order(wsk->lewy); // przechodzimy lewe poddrzewo
post_order(wsk->prawy); // przechodzimy prawe poddrzewo
cout<<wsk->klucz<< " "; // odwiedzamy węzeł
}
};
//----------------MAIN----------------//
int main()
{
clock_t begin, end;
double time_spent;
begin = clock();
srand(time(NULL));
odczyt_pliku();
usun(k1);
dodaj_wezel(k1);
dodaj_x_wezlow(X);
cout<<endl<<endl<<"INORDER: ";
in_order(drzewo.korzen);
cout<<endl<<endl<<"PREORDER: ";
pre_order(drzewo.korzen);
dodaj_wezel(k2);
cout<<endl<<endl<<"INORDER: ";
in_order(drzewo.korzen);
dodaj_wezel(k3);
dodaj_wezel(k4);
usun(k1);
cout<<endl<<endl<<"PREORDER: ";
pre_order(drzewo.korzen);
wyszukaj(k1);
usun(k2);
cout<<endl<<endl<<"INORDER: ";
in_order(drzewo.korzen);
usun(k3);
usun(k4);
end = clock();
time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
cout<<endl<<endl<<"Czas wykonania instrukcji "<<time_spent<<endl;
return 0;
}