
#include "hlavicka.h"

using namespace std;




vrchol::vrchol(){
  p_vaha=new Cislo(0);
  p_otec=this;
  koniec=true;
  p_som=true;
  sek=0;
  syn0=0;
  syn1=0;
  //cerr << "vyrobil som vrchol kodujuci koniec "<< this << endl;
}    

vrchol::vrchol(vrchol* s0,vrchol* s1){
  syn0=s0;
  syn1=s1;
  sek=0;
  p_vaha=new Cislo(s0->vaha()+s1->vaha());
  p_som=false;
  p_otec=this;
  koniec=false;
  //cerr << "vyrobil som otca vrcholov " << syn0 << " " << syn1 << endl; 
  povedz();
}

vrchol::vrchol(Cislo c,long s):p_vaha(0){
  sek=s;
  syn0=0;
  syn1=0;
  delete p_vaha;
  p_vaha=new Cislo(c);
  p_som=true;
  p_otec=this;
  koniec=false;
  //cerr << "vyrobil som vrchol kodujuci sekvenciu " << sek << " s pravdepodobnostou " << p_vaha->normal() << " " << this << endl;  
}

vrchol::~vrchol(){
  
    delete(p_vaha);
  /*  if(!som()){
      delete(syn0);
      delete(syn1);
    }*/
  
}

void vrchol::zmaz(){
  //delete p_vaha;
 // cerr << p_som << " " << som() << endl;
  if(!p_som){
    syn0->zmaz();
    syn1->zmaz();
    delete syn0;
    delete syn1;
  }
}

vrchol& vrchol::operator=(const vrchol& arg){
  this->syn0=arg.syn0;
  this->syn1=arg.syn1;
  this->p_otec=arg.p_otec;
  this->sek=arg.sek;
  this->p_vaha=arg.p_vaha;
  this->p_som=arg.p_som;
  this->koniec=arg.koniec;
  return (*this);
}


vrchol::vrchol(const vrchol& arg):p_vaha(0){ 
  sek=arg.sek;
  syn0=0;
  syn1=0;
  delete p_vaha;
  p_vaha=new Cislo(arg.vaha());
  p_som=arg.som();
  p_otec=this;
  koniec=arg.koncim();
  //  cerr << "vytvoril som kopiu vrcholu " << &arg << " " << this << endl; 
}

bool vrchol::som()const{// ci je list
return p_som;
}

bool vrchol::koncim()const{// ci som na konci kodovanej sekvencie
return koniec;
}

Cislo vrchol::vaha()const{// vracia vahu vrcholu
return Cislo(*p_vaha);    
}

void vrchol::otec(vrchol* v){// nastavi smernik na otca
p_otec=v;   
}

void vrchol::povedz(){// posle synom smernik na otca
//cerr << "hovorim " << this << " synom " << syn0 << " " << syn1 << endl;    
syn0->otec(this);
syn1->otec(this);
}

long vrchol::sekvencia()const{// vrati kodovanu sekvenciu
if (p_som) return sek;
return -1;
}

vrchol* vrchol::l_syn()const{//vrati laveho (0) syna
return syn0;
}

vrchol* vrchol::p_syn()const{//vrati praveho (1) syna
return syn1;
}

vrchol* vrchol::motec()const{//vrati otca
//cerr << "idem povedat svojho otca som "<< this << " a otec je " << p_otec << endl;
return p_otec;
}

bool operator< (const vrchol& v1,const vrchol& v2){
  return v1.vaha()<v2.vaha();
}

bool operator> (const vrchol& v1,const vrchol& v2){
  return v1.vaha()>v2.vaha();
}




bool operator< (ukaz u1, ukaz u2){
  //  cerr << "porovnavam " << u1.moj << " " << u2.moj << endl;
  
  return (u1.moj)<(u2.moj);
}

bool operator> (ukaz u1, ukaz u2){
  //  cerr << "porovnavam  " << u1.moj << " " << u2.moj << endl;
  return (u1.moj)>(u2.moj);
}

ukaz::ukaz(vrchol* v){
  moj=v;
  //cerr << "tvorim ukaz na: " << moj << endl;    
}

ukaz::ukaz(const ukaz& arg){
  moj=arg.moj;
}

ukaz& ukaz::operator=(const ukaz& arg){
  this->moj=arg.moj;
  return (*this);
}

ukaz::ukaz(){
  moj=0;
}




