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; 
    
}