Szukam tego błędu i szukam, może ktoś znajdzie błąd;)
Zadanie było takie, żeby na trzech tablicach: val - wartości jakie mają się znaleźć w drzewie (są podane), L - indeksy (z tablicy val) lewych synów (wypełniane przez funkcję wstaw), P - indeksy prawych synów (wypełniane przez funkcję wstaw). Funkcja Wstaw działa na zasadzie: jeżeli syn większy od ojca to jest synem prawym, w przeciwnym przypadku lewym, jeżeli dane miejsce jest już zajęte to wywołanie rekurencyjne. Jeżeli dany węzeł nie ma danego syna to -1 (na samym początku wypełniam tablice P i L -1). Problem polega na tym, że w pewnym miejscu z prawej podgałęzi przeskakuje mi na lewą. Podejrzewam, że rekurencja może być w złym miejscu, ale pewna nie jestem. (problem w funkcji wstaw).
Na danym przykładzie błąd widać w jednym miejscu: w tablicach L i P indeksy 8 i 5 powinny być na odwrót.
#include <iostream>
#include <cstdlib>
using namespace std;
void wstaw(int *lewy, int *prawy, int *val, int ile)
{
static int i=1,j=0;
//int ile=9;
if(val[i]<val[j])
{
if(lewy[j]==-1)
{
lewy[j]=i;
i++;
j=0;
if(i<ile)
{
wstaw(lewy,prawy,val,ile);
}
}
else
{
j++;
wstaw(lewy,prawy,val,ile);
}
}
else
{
if(prawy[j]==-1)
{
prawy[j]=i;
i++;
j=0;
if(i<ile)
{
wstaw(lewy,prawy,val,ile);
}
}
else
{
j++;
wstaw(lewy,prawy,val,ile);
}
}
}
void zeruj(int *tab, int n) //tablica którą zerujemy, ile elementów w tablicy
{
for(int i=0; i<n; i++)
{
tab[i]=-1;
}
}
void wypisz(int *tab,int n)
{
for(int i=0;i<n;i++)
{
cout<<tab[i]<<"\t ";
}
cout<<endl;
}
int main()
{
const int n=9;
int val[n]={20,4,16,3,8,6,-4,21,3};
int lewy[n],prawy[n];
zeruj(lewy,n);
zeruj(prawy,n);
wypisz(val,n);
wypisz(lewy,n);
wypisz(prawy,n);
wstaw(lewy,prawy,val,n);
cout<<endl;
wypisz(val,n);
wypisz(lewy,n);
wypisz(prawy,n);
cout<<endl;
system("pause");
return 0;
}