#include BinTree::BinTree() { nGnr_=0; ant_=0; up_=0; lo_=0; hi_=0; } BinTree::BinTree(BinTree* up) { BinTree(longint(),1,up); } BinTree::BinTree(longint nGnr, BinTree* up) { BinTree(nGnr,1,up); } BinTree::BinTree(longint nGnr, double ant, BinTree* up) { nGnr_=nGnr; ant_=ant; up_=up; lo_=0; hi_=0; } BinTree::~BinTree() { delete lo(); //Hur går det med up_ här? delete hi(); up_=0; } double BinTree::ant() { return ant_; } longint BinTree::nGnr() { return nGnr_; } BinTree* BinTree::lo() { return lo_; } BinTree* BinTree::hi() { return hi_; } BinTree* BinTree::up() { return up_; } void BinTree::inc() { ant_++; } void BinTree::setant(double ant) { ant_=ant; } void BinTree::sortin(longint nGnr) { char tch; longint this_nGnr=nGnr_; //blir fel med anv av accessorfunk...(p g a lika namn) if (nGnr==this_nGnr) { inc(); } else { if (nGnrant_=1; lo_->nGnr_=nGnr; lo_->up_=this; } else { lo()->sortin(nGnr); } } else { if (hi()==0) { hi_=new BinTree(); hi_->ant_=1; hi_->nGnr_=nGnr; hi_->up_=this; } else { hi()->sortin(nGnr); } } } } double BinTree::get(longint nGnr) { longint this_nGnr=nGnr_; if (nGnr==this_nGnr) return ant(); else { if ((nGnrget(nGnr); else { if ((nGnr>this_nGnr) && (hi()!=0)) return hi()->get(nGnr); else return 0; } } } void BinTree::set(longint nGnr, double ant) { longint this_nGnr=nGnr_; if (nGnr==this_nGnr) ant_=ant; else { if (nGnrset(nGnr, ant); } { if (nGnr>this_nGnr) if (hi()==0) hi_=new BinTree(nGnr,ant,this); else hi()->set(nGnr,ant); } } } void BinTree::copy(BinTree* bt) { nGnr_=bt->nGnr(); ant_=bt->ant(); if (bt->lo()!=0) { lo_=new BinTree(this); lo_->copy(bt->lo()); } if (bt->hi()!=0) { hi_=new BinTree(this); hi_->copy(bt->hi()); } } BinTree* BinTree::min() { if (lo()==0) return this; else return lo()->min(); } void BinTree::div(double divisor) //kanske kunde divisor vara int? { ant_=ant_/divisor; if (hi()!=0) hi()->div(divisor); if (lo()!=0) lo()->div(divisor); } BinTree* BinTree::next(longint nGnr) { char tch; if (hi()!=0) //Försök ta ett steg åt höger return hi()->min(); //skicka tillbaka minsta nGnr i denna gren BinTree* tmp=this; while (tmp->up()!=0) //så länge toppen inte nåtts { if (tmp->up()->nGnr()>nGnr) //se om ett större nGnr hittats return tmp->up(); //skicka då tillbaka detta tmp=tmp->up(); //gå annars vidare upp } return 0; //om toppen nås utan att större element //hittats, är trädet helt genomsökt }