BST problema output

di il
4 risposte

BST problema output

Salve a tutti. Mi stavo esercitando con gli alberi binari di ricerca, e ho provato a fare un esercizio nel quale dovevo stampare tutte le chiavi che avevano un padre con un fratello. Il metodo sembra funzionare perfettamente, il problema è che quando non deve stampare la chiave, ansicchè non fare nulla, stampa il carattere " ". In questo modo tutto il file di output inizia con almeno uno spazio vuoto. Sapete quale possa essere l'errore? come posso risolvere? in basso vi allego il codice

#include <iostream>
#include <fstream>

using namespace std;

ifstream in("input.txt");
ofstream out("output.txt");

template <class H>
class Nodo{
private:
    H elemento;
    Nodo<H>* padre;
    Nodo<H>* dx;
    Nodo<H>* sx;
public:
    Nodo(H _elemento):elemento(_elemento){
        this->padre=NULL;
        this->dx=NULL;
        this->sx=NULL;
    }
    H getElemento(){return elemento;}
    Nodo<H>* getPadre(){return padre;}
    Nodo<H>* getDx(){return dx;}
    Nodo<H>* getSx(){return sx;}

    void setElemento(H x){this->elemento=x;}
    void setPadre(Nodo<H>* padre){this->padre=padre;}
    void setDx(Nodo<H>* dx){this->dx=dx;}
    void setSx(Nodo<H>* sx){this->sx=sx;}
};

template <class H>
class Tree{
private:
    Nodo<H>* radice;
public:
    Tree(){this->radice=NULL;}
    void ins(H x){
        Nodo<H>* nuovo=new Nodo<H>(x);
        if(radice==NULL)
            radice=nuovo;
        else{
            Nodo<H>* iter=radice;
            Nodo<H>* tmp=NULL;
            while(iter!=NULL){
                tmp=iter;
                if(x>iter->getElemento())
                    iter=iter->getDx();
                else
                    iter=iter->getSx();
            }
            nuovo->setPadre(tmp);
            if(x>tmp->getElemento())
                tmp->setDx(nuovo);
            else
                tmp->setSx(nuovo);
        }
    }


    Nodo<H>* cerca(H val){
        Nodo<H>* x=radice;
        while(x!=NULL && x->getElemento()!=val){
            if(x->getElemento()>val)
                x=x->getSx();
            else
                x=x->getDx();
        }
        return x;
    }
    Nodo<H>* minimo(Nodo<H>* minimo){
        Nodo<H>* x=minimo;
        while(x->getSx()!=NULL) x=x->getSx();
        return x;
    }
    void Trapianta(Nodo<H>* x, Nodo<H>* y){
        if(x->getPadre()==NULL) radice=y;
        else if(x==x->getPadre()->getSx())
            x->getPadre()->setSx(y);
        else
            x->getPadre()->setDx(y);
        if(y)
            y->setPadre(x->getPadre());
    }
    void Cancella(H val){
        Nodo<H>* x=cerca(val);
        if(x){
            if(x->getSx()==NULL)
                Trapianta(x, x->getDx());
            else if(x->getDx()==NULL)
                Trapianta(x, x->getSx());
            else{
                Nodo<H>* y=minimo(x->getDx());
                if(y->getPadre()!=x){
                    Trapianta(y, y->getDx());
                    y->setDx(x->getDx());
                    y->getDx()->setPadre(y);
                }
                Trapianta(x, y);
                y->setSx(x->getSx());
                y->getSx()->setPadre(y);
            }
            delete x;
        }
    }
    
        void visitaPostorder(Nodo<H>* x){
        if(x){
            visitaPostorder(x->getSx());
            visitaPostorder(x->getDx());
            func(x); 
			out<< " ";
        }
    }
    
	void func (Nodo<H>* x){
    	Nodo<H>* iter = x;
    	if(!iter->getPadre())
			return;	
		else
    		iter=iter->getPadre();	
    	if(!iter->getPadre())
    		return;
    	else
    	iter=iter->getPadre();
    		
    	if(iter->getDx() != NULL && iter->getSx() != NULL)
   
    		 out<<x->getElemento();
	}
    
    void print(){
        visitaPostorder(radice);
    }
};

template <class H>
void metodo(int n){
    Tree<H>* tree=new Tree<H>;
    H val; char a;
    for(int i=0; i<n; i++){
        in>>a;
        if(a=='i'){
            while(a!=':')
                in>>a;
            in>>val;
            tree->ins(val);
        }
        else if(a=='c'){
            while(a!=':')
                in>>a;
            in>>val;
            tree->Cancella(val);
        }
    }
    	 tree->print(); 
		 out<<endl;
}

int main()
{
    string type; int n; 
    for(int i=0; i<100; i++){
        in>>type; in>>n; 
        if(type=="int") metodo<int>(n);
        if(type=="double") metodo<double>(n);
    }
    return 0;
}



come si può evincere dal codice, prendo in input un file di 100 righe per costruire l'albero, e il file di output deve avere per ogni riga tutte le chiavi che hanno il padre con un fratello.

Spero di non essermi dilungato troppo, auguro a tutti una buona serata

4 Risposte

  • Re: BST problema output

    
    if(x){
                visitaPostorder(x->getSx());
                visitaPostorder(x->getDx());
                func(x); 
    			out<< " ";
            }
    void func (Nodo<H>* x){
        	Nodo<H>* iter = x;
        	if(!iter->getPadre())
    			return;	
    		else
        		iter=iter->getPadre();	
        	if(!iter->getPadre())
        		return;
        	else
        	iter=iter->getPadre();
        		
        	if(iter->getDx() != NULL && iter->getSx() != NULL)
       
        		 out<<x->getElemento();
    	}
    
    Non deve fare niente quando x è nullo o quando non si verificano certe condizioni in func se non sbaglio. Se provi a mettere out(spazio) direttamente in func?
    Perché per come è scritta basta che x non sia nullo e lo spazio viene sempre stampato.

    Ps: in C++ moderno si usa nullptr, non null
  • Re: BST problema output

    Alexv ha scritto:


    
    if(x){
                visitaPostorder(x->getSx());
                visitaPostorder(x->getDx());
                func(x); 
    			out<< " ";
            }
    void func (Nodo<H>* x){
        	Nodo<H>* iter = x;
        	if(!iter->getPadre())
    			return;	
    		else
        		iter=iter->getPadre();	
        	if(!iter->getPadre())
        		return;
        	else
        	iter=iter->getPadre();
        		
        	if(iter->getDx() != NULL && iter->getSx() != NULL)
       
        		 out<<x->getElemento();
    	}
    
    Non deve fare niente quando x è nullo o quando non si verificano certe condizioni in func se non sbaglio. Se provi a mettere out(spazio) direttamente in func?
    Perché per come è scritta basta che x non sia nullo e lo spazio viene sempre stampato.

    Ps: in C++ moderno si usa nullptr, non null
    Ciao @Alexv, innanzitutto ti ringrazio per avermi risposto e per il tempo dedicatomi, ho messo lo spazio nella funzione ed effettivamente ho risolto .
    Grazie mille veramente!

    PS per quanto riguarda nullptr il mio professore non lo ha mai usato, probabilmente il suo C++ non è moderno sicuramente lo inizierò ad usare.
  • Re: BST problema output

    Di niente.
    Il compilatore deve supportare almeno C++ 11 infatti, ma i prof a volte sono un po' anacronistici, quindi usa la costante NULL se te lo dice lui.
  • Re: BST problema output

    Alexv ha scritto:


    Di niente.
    Il compilatore deve supportare almeno C++ 11 infatti, ma i prof a volte sono un po' anacronistici, quindi usa la costante NULL se te lo dice lui.
    Va bene Alexv , grazie ancora per i tuoi consigli, una buona giornata
Devi accedere o registrarti per scrivere nel forum
4 risposte