PDA

View Full Version : [C] Albero binario e somma nodi livello k


gabmac2
28-02-2010, 23:21
Come faccio a sommare i nodi a livello k se posso solo "portare su" a e liv?
int sommalivello(Albero *a, int livcorr, int liv)
{ if (a==NULL) return 0;
else
if (livcorr==liv) return a->inf;
else return (sommalivello(a->left,livcorr+1,liv)+
sommalivello(a->right,livcorr+1,liv));
}

Grazie in anticipo

bobbytre
28-02-2010, 23:38
Come faccio a sommare i nodi a livello k se posso solo "portare su" a e liv?

Grazie in anticipo

dovresti postare anche la struttura dell'albero

perchè a->inf ad esempio cos'e' ?

DanieleC88
01-03-2010, 00:51
Che intendi con "portare su"? :wtf:

gabmac2
01-03-2010, 08:36
intanto grazie,intendo dire passarlo come parametro e nella struttura dell' albero ho
int val e 2 struct per *left e *right

fero86
01-03-2010, 11:30
facilissimo :O

pseudocodice, spero si capisca:
(R é il nodo radice dell'albero, R.Left é il figlio sinistro, R.Right il destro, k é il livello, i é un parametro intero che indica il livello corrente)

function f(R, k, i) :
if i < k :
n <- 0
if R has left child :
n <- n + f(R.Left, k, i + 1)
if R has right child :
n <- n + f(R.Right, k, i + 1)
return n
else :
return 1


chiamata iniziale:
f(T, k, 0)
dove T é un albero e k il livello.

DanieleC88
01-03-2010, 12:19
intanto grazie,intendo dire passarlo come parametro e nella struttura dell' albero ho
int val e 2 struct per *left e *right

Ah, se puoi passare solo il livello e l'albero allora si fa in una maniera quasi identica a quella che ti ha descritto fero86:

algoritmo SommaLivelloK(albero T, intero L)
{
intero risultato = 0;

se (T non è nullo) e (L >= 0) {
risultato += chiave(T);
risultato += SommaLivelloK(sinistro(T), L - 1);
risultato += SommaLivelloK(destro(T), L - 1);
}

restituisci risultato;
}


ciao ;)

P.S.: chiaramente, le funzioni chiave(), sinistro() e destro() associano ad ogni nodo dell'albero, rispettivamente, un valore chiave, un figlio sinistro, un figlio destro.

gabmac2
01-03-2010, 14:36
grazie davvero ragazzi,ho risolto,ma ho un nuovo problema,
int sommapos(bst *a,int pos,int x){
int k;
if(a==NULL) return 0;
else{
if(pos%x==0)
return a->val+sommapos(a->left,pos+1,x)+sommapos(a->right,pos+1,x);
else return sommapos(a->left,pos+1,x)+sommapos(a->right,pos+1,x);}}
come faccio a sommare a nodi in pos multipla a x (in preordine) portando su solo x e non pos?
Grazie

Maestro
02-03-2010, 15:17
Chiedo scusa al thread starter se mi intrometto ma ho visto questo thread a proposito di ricorsione ed alberi ennari e volevo chiedere un quesito in questa sede visto che mi sembrate molto competenti in materia :D

Se la mia funzione torna un array, come posso fare per eseguirla ricorsivamente *per ogni elemento dell'array* (che a sua volta potrà originare un array con più di un elemento)?

Attraverso un for posso scorrere tutto l'array e richiamare la funzione con l'oggetto aggiornato ma si ferma ovviamente (?) al primo elemento e non li scorre tutti.

Non so se sia rilevante, ma nel mio caso sto usando PHP.

DanieleC88
02-03-2010, 15:23
grazie davvero ragazzi,ho risolto,ma ho un nuovo problema,

come faccio a sommare a nodi in pos multipla a x (in preordine) portando su solo x e non pos?
Grazie

Dev'essere necessariamente ricorsiva? Perché IMHO viene più semplice da fare iterativamente.