#include <iostream>
#include <cstdlib>
#include <ctime>
#include "prvo_dijete-sljedeci_brat.h"
#include "algoritmi_ophodjenja.h"
//#include "polje.h" 
#include "pokazivaci.h"
using namespace std;

void opcenito_stablo(){
	tree stablo=new tstablo;
	cout<<"Dodjela oznake = indeks*3(osim korijena)"<<endl;
	cout<<"Inicijaliziram stablo s korijenom na indexu 0 i oznakom 6..."<<endl;
                     initT(0,stablo);
	
	cout<<"Oznaka korijena:"<<labelT(rootT(stablo),stablo)<<endl;	
	cout<<"Dodajem potomke korijenu [indeksi:3,6,7]:"<<endl;
                     createT(3,0,stablo);  createT(6,0,stablo); createT(7,0,stablo);
	
	cout<<"Oznaka(indeks) prvog dijeteta korijena:"<<labelT(firstchildT(0,stablo),stablo)<<"(";
                     cout<<firstchildT(0,stablo)<<")"<<endl;
	
	cout<<"Stablo(oznake):\n\t"<<labelT(0,stablo)<<endl;
                     cout<<labelT(3,stablo)<<"\t"<<labelT(6,stablo)<<"\t"<<labelT(7,stablo)<<endl;
	
	cout<<"\nDodajem potomke prvom dijetetu[3]->4,8 i sljedecem bratu[6]->5,9"<<endl;
	                 createT(4,3,stablo); createT(8,3,stablo); 
	                 createT(5,6,stablo); createT(9,6,stablo);
	
	cout<<"Pokusavam napraviti potomka nepostojecem cvoru[100]"<<endl;
	                 createT(4,100,stablo);
	
	cout<<"Roditelji cvora 8:"<<parentT(8,stablo)<<", 3:"<<parentT(3,stablo)<<endl;
	cout<<"Mijenjam oznaku korijena iz 6 u 666..."<<endl;
	                 changelabelT(666,rootT(stablo),stablo);
	
	cout<<"Korijen stabla sa svojom djecom..."<<endl;
	cout<<"\t"<<labelT(0,stablo)<<endl;
	                 cout<<labelT(3,stablo)<<"\t"<<labelT(6,stablo)<<"\t"<<labelT(7,stablo)<<endl;
	
	cout<<"Brisem cijelo stablo..."<<endl;
	                 deleteT(0,stablo);
	
	cout<<"Oznaka i prvo dijete(indeks u zagradi) korijena nakon brisanja:"<<labelT(rootT(stablo),stablo);
	                 cout<<"("<<firstchildT(0,stablo)<<")"<<endl;
  delete stablo;
}
void ophodjenje(){
	tree stablo=new tstablo;
	int izbor;
	cout<<"Inicijaliziram stablo s korijenom na indexu 0..."<<endl;
                   initT(0,stablo);
	cout<<"Dodajem potomke(indeksi 4,5,6):"<<endl;
                   createT(4,0,stablo);createT(5,0,stablo);createT(6,0,stablo);
	cout<<"Dodajem potomke( 4->2,3,13, 5->11,12 , 6->8,9 )"<<endl;
	               createT(2,4,stablo);createT(3,4,stablo);createT(13,4,stablo);
	               createT(11,5,stablo);createT(12,5,stablo);
                   createT(8,6,stablo);createT(9,6,stablo);
	cout<<"Stablo:"<<endl;
	cout<<"Izaberite algoritam ophodjenja:\n----------"<<endl;
	cout<<"1-Preorder | 2-Inorder | 3-Postorder:";
	cin>>izbor;
	switch(izbor){
		case 1:
		Preorder(rootT(stablo),stablo);
		cout<<endl;
		system("pause");
		system("cls");
		break;
		case 2:
		Inorder(rootT(stablo),stablo);
		cout<<endl;
		system("pause");
		system("cls");
		break;
		case 3:
		Postorder(rootT(stablo),stablo);
		cout<<endl;
		system("pause");
		system("cls");
		break;
	}
  delete stablo;
}

void binarno_stablo(){
	int izbor;
	btree stablo=new tbstablo;
	int x;
	cout<<"Unesi oznaku korijena:";
	cin>>x;
	initB(x,stablo);

		cout<<"Kreiram stablo...  "<<endl;
		cout<<"LEVEL 0 - korijen\n-------"<<endl;
		cout<<"Adresa korijena:"<<rootB(stablo)<<endl;
		cout<<"Oznaka korijena:"<<labelB(rootB(stablo),stablo)<<endl;
		              cvor korijen=rootB(stablo);
		cout<<"LEVEL 1\n---------"<<endl;	
		cout<<"Korijenu dodajem lijevi(oznaka 2) i desni(oznaka 3) cvor..."<<endl;
		                createleftB(2,korijen,stablo);
		                cvor ld1=leftchildB(korijen,stablo);
		                createrightB(3,korijen,stablo);
		                cvor rd1=rightchildB(korijen,stablo);
		cout<<"LEVEL 2\n---------"<<endl;
		cout<<"Lijevom dijetetu korijena dodajem lijevi(oznaka 4) i desni(oznaka 5) cvor..."<<endl;
		                createleftB(4,ld1,stablo);
		                cvor ld2=leftchildB(ld1,stablo);
		                createrightB(5,ld1,stablo);
		                cvor rd2=rightchildB(ld1,stablo);
		cout<<"Desnom dijetetu korijena dodajem samo desni cvor(oznaka 6)..."<<endl;
		                createrightB(6,rd1,stablo);
		                cvor rd3=rightchildB(rd1,stablo);
		cout<<"LEVEL 3\n------"<<endl;
		cout<<"Cvoru s oznakom 4 dodajem samo lijevi cvor(oznaka 7)..."<<endl;
		                createleftB(7,ld2,stablo);
		                cvor ld3=leftchildB(ld2,stablo);
		cout<<"Cvoru s oznakom 5 dodajem samo desni cvor(oznaka 8)"<<endl;
		                createrightB(8,rd2,stablo);
		                cvor rd4=rightchildB(rd2,stablo);
		                int oznaka;
		cout<<"Oznaka lijevog dijeteta korijena:"<<labelB(leftchildB(rootB(stablo),stablo),stablo)<<endl;
		cout<<"Mijenjam oznaku korijena...Unesite oznaku:"<<endl;
	 	                cin>>oznaka;
		                changelabelB(oznaka,rootB(stablo),stablo);
		cout<<"Adresa roditelja cvora s oznakom 4:"<<parentB(ld2,stablo)<<endl;
		cout<<"Oznaka roditelja cvora s oznakom 4:"<<labelB(parentB(ld2,stablo),stablo)<<endl;
	    cout<<"Brisem stablo od lijevog dijeteta korijena..."<<endl;
                        deleteB(leftchildB(korijen,stablo),stablo);
	    cout<<"Adresa lijevog dijeteta korijena(bitno u slucaju pok.)"<<leftchildB(korijen,stablo)<<endl;
	    cout<<"Brisem stablo od desnog dijeteta korijena..."<<endl;
                        deleteB(rightchildB(korijen,stablo),stablo);
	    cout<<"Adresa desnog dijeteta korijena(bitno u slucaju pok.)"<<rightchildB(korijen,stablo)<<endl;
	    
}

int main(){
	
	int izbor;
	do{
		cout<<"1. Opcenito stablo: prvo dijete - sljedeci brat"<<endl;
		cout<<"2. Algoritmi ophodjenja stabla"<<endl;
		cout<<"3. Binarno stablo"<<endl;
		cout<<"9.Izlaz"<<endl;
		cout<<"Odaberi:";
		cin>>izbor;
		system("cls");
		switch(izbor)
		{
			case 1:
			opcenito_stablo();
			break;
			case 2:
			ophodjenje();
			break;
			case 3:
			binarno_stablo();
			break;
			case 4:
			break;
			case 9:cout<<"Izlaz!"<<endl;break;
			default:cout<<"Pogresan unos!"<<endl;
		}
		
	}while(izbor!=9);
	system("pause");
}