#include <iostream>
#include <cstdlib>
//Implementacija binarnog stabla pomoću polja
using namespace std;


struct elementB{
       char oznaka;
       bool puno;
       };
struct Bstablo{
       struct elementB elementi[10000];
       };
typedef Bstablo *Bdrvo;
typedef int Bcvor;


int ispisB = 3; 
int brojacB = 0; 

Bcvor RootB(Bstablo *B){
     if(B->elementi[1].puno) return 1;
     else return 0;
     }

char LabelB(Bcvor n, Bstablo *B){
     return B->elementi[n].oznaka;
     }

Bcvor FindB(Bstablo *B, char x){
        for(int i=0; i<10000; i++)
            if(x == B->elementi[i].oznaka){
                 return i;
                 }
        return 0;                 
        }

void ispis_stablaB(Bstablo *B){
      cout << "------------------------------------------"<<endl;
      cout << "Struktura: indeks   oznaka   stanje(0-prazno, 1-puno)"<<endl;
      cout << "------------------------------------------"<<endl;
      for(int i=1; i<ispisB+brojacB; i++){
            if(LabelB(RootB(B),B)=='0'){
                                         cout << "\tSTABLO JE OBRISANO."<<endl;
                                         break;
                                         }
             else cout << i <<"\t"<<B->elementi[i].oznaka<<"\t"<<B->elementi[i].puno<<endl;
             }
     cout << endl;
     }

Bstablo *InitB(char x, Bstablo *B){
     for(int i=0;i<10000;i++){
                     B->elementi[i].oznaka = '0';
                     B->elementi[i].puno = false;
                     }
      B->elementi[1].oznaka = x;
      B->elementi[1].puno = true;
      brojacB=0;
      return B; 
     }     

Bcvor ParentB(Bcvor n, Bstablo *B){
     if(n==RootB(B)) return 0;
     else return n/2;
     }
Bcvor LeftChildB(Bcvor n, Bstablo *B){
     if(B->elementi[2*n].puno) return 2*n;
     else return 0;
     }
Bcvor RightChildB(Bcvor n, Bstablo *B){
     if(B->elementi[2*n+1].puno) return 2*n+1;
     else return 0;
     }

void ChangeLabelB(char x, Bcvor n, Bstablo *B){
     B->elementi[n].oznaka = x;
     }
void CreateLeftB(char x, Bcvor n, Bstablo *B){
     if(2*n>9999){ cout<< "Vise nema mjesta!"<<endl; return;}
     if(B->elementi[2*n].puno) cout << "\tPogreska! Cvor vec ima lijevo dijete."<<endl;
     else {
          B->elementi[2*n].oznaka =  x;
          B->elementi[2*n].puno = true;
          cout << "\tLijevo dijete je dodano."<<endl;
          brojacB++;
          }
     }
void CreateRightB(char x, Bcvor n, Bstablo *B){
     if((2*n+1)>9999){ cout << "Vise nema mjesta!"<<endl; return;}
     if(B->elementi[2*n+1].puno) cout << "\tPogreska! Cvor vec ima Desno dijete."<<endl;
     else {
          B->elementi[2*n+1].oznaka =  x;
          B->elementi[2*n+1].puno = true;
          cout << "\tDesno dijete je dodano."<<endl;
          brojacB++;
          }
     }
void DeleteB(Bcvor n, Bstablo *B){
     if(B->elementi[2*n].puno) DeleteB(2*n,B);
     if(B->elementi[2*n+1].puno) DeleteB((2*n+1),B);
     B->elementi[n].oznaka = '0';
     B->elementi[n].puno = false;
     brojacB--;
     }