xjokerx
Utente Attivo
- Messaggi
- 161
- Reazioni
- 8
- Punteggio
- 49
Salve, oggi vi scrivo perché ho riscontrato un problema con l'implementazione del codice per quanto riguarda il calcolo del peso di un albero. In sostanza devo fare un esercizio in cui mi si chiede di calcolare il peso di un nodo dato, indicando che il peso è la somma del valore del nodo dato e di tutti i nodi del sottoalbero dello stesso nodo. Ora il mio problema è che la funzione da me scritta restituisce sempre -1 e non riesco a capire perché non riesce a sommare le varie chiavi contenute nei nodi. Vi lascio il codice sperando possiate aiutarmi.
C++:
#include <iostream>
#include <fstream>
using namespace std;
template <class T>
class Nodo {
T key;
Nodo<T> *padre, *sx, *dx;
public:
Nodo() {
key = 0;
padre = sx = dx = NULL;
}
void setKey(T key) { key = key;}
void setPadre(Nodo<T>* p) {padre = p;}
void setSx(Nodo<T>* s) {sx = s;}
void setDx(Nodo<T>* d) {dx = d;}
T getKey() {return key;}
Nodo<T>* getPadre() {return padre;}
Nodo<T>* getSx() {return sx;}
Nodo<T>* getDx() {return dx;}
};
template <class T>
class BST {
private:
Nodo<T>* root; //puntatore al nodo radice
int n; //numero di nodi dell'albero
Nodo<T>* _ricerca(T key, Nodo<T>* x) {
//funzione ausiliaria per la ricerca di un nodo
Nodo<T>* tmp = x;
while (tmp != NULL && tmp->getKey() != key) {
if (key < tmp->getKey())
tmp = tmp->getSx();
else
tmp = tmp->getDx();
}
return tmp;
}
T _peso(Nodo<T>* x) {
//funzione ricorsiva ausiliaria per calcolare il peso
if (x) {
return x->getKey()+_peso(x->getSx())+_peso(x->getDx());
}
return -1;
}
public:
BST() {
root = NULL;
n = 0;
}
BST<T>& ins (T key) {
//funzione di inserimento di un valore nell'albero
Nodo<T>* tmp = root;
Nodo<T>* padre = NULL;
Nodo<T>* x = new Nodo<T>();
n++;
while (tmp != NULL) {
padre = tmp;
if (key <= tmp->getKey())
tmp = tmp->getSx();
else
tmp = tmp->getDx();
}
if (padre == NULL) {
root = x;
return *this;
}
if (key <= padre->getKey())
padre->setSx(x);
else
padre->setDx(x);
x->setPadre(padre);
return *this;
}
T peso(T key) {
//funzione per far restituire il peso
Nodo<T>* tmp = _ricerca(key, root);
if (tmp) {
return _peso(tmp);
}
return -1;
}
};
int main() {
BST<int> *t = new BST<int>();
t->ins(100).ins(40).ins(120).ins(70).ins(150);
cout << t->peso(40) << endl;
delete t;
return 0;
}