PDA

View Full Version : [Java] metodi ricorsivi


Katastrophe1602
07-06-2013, 21:57
ho un albero binario:
class Albero {
Albero left, right;
int val;

Albero(int i, Albero a, Albero b){
left=a;
right=b;
val=i;
}
}

Esempio inizializzazione:
Albero x=new Albero(3, new Albero(6,null,null),new Albero(2, null, new Albero(3,null,null)));
Non riesco a capire come fare un metodo ricorsivo per visualizzare tutti gli elementi a distanza n dalla radice

ingframin
08-06-2013, 08:40
ho un albero binario:
class Albero {
Albero left, right;
int val;

Albero(int i, Albero a, Albero b){
left=a;
right=b;
val=i;
}
}

Esempio inizializzazione:
Albero x=new Albero(3, new Albero(6,null,null),new Albero(2, null, new Albero(3,null,null)));
Non riesco a capire come fare un metodo ricorsivo per visualizzare tutti gli elementi a distanza n dalla radice

public class Node {
Node left;
Node right;
int val;

public Node(int value) {
this.val = value;
}

public void append(int val){
if(val>this.val){
if(this.right!= null){
this.right.append(val);
}
else{
this.right = new Node(val);
}
}//val>this.val
if(val<this.val){
if(this.left!=null){
this.left.append(val);
}
else{
this.left = new Node(val);
}
}//val<this.val

}//append

public void print(){
System.out.println(this.val);
if(this.right != null){
System.out.print("right= ");
this.right.print();
}
if(this.left != null){
System.out.print("left= ");
this.left.print();
}


}//print

public void print(int level){

if (level>0) {
System.out.println(this.val);
if (this.right != null) {
System.out.print("right= ");
this.right.print(level-1);
}
if (this.left != null) {
System.out.print("left= ");
this.left.print(level-1);
}
}


}//print


public static void main(String[]args){
Node a = new Node(5);
for(int i= 0; i<10;i++){
a.append(i);
a.append(i-5);
}

a.print();
a.print(2);

}
}

Tié, magnace il pane :P
A parte gli scherzi, se non ti è chiaro te lo spiego con più dettagli :)

clockover
08-06-2013, 13:06
Io l'avrei fatto così, non l'ho provato ma più o meno dovrebbe essere così

public void print(distanza, nodo){
if nodo == null
return
print(0, distanza, nodo);
}
private void print(current, distanza, nodo){
if current == distanza
stampa elemento
else
if nodo.left != null
print(current + 1, distanza, nodo.left)
if nodo.right != null
print(current + 1, distanza, nodo.right)
}
1) effettui un controllo sul nodo passato come parametro
2) richiami il metodo print con la distanza corrente, quella richiesta e il nodo
3) se la distanza corrente è uguale a quella richiesta stampa
4) altrimenti, dopo aver verificato la presenza del nodo sinistro, effettua una chiamata ricorsiva a sinistra, incrementando il contatore della distanza corrente
5) idem com sopra per il destro

@ingframin
ma in quel modo non stampi tutti gli elementi che si trovano a meno di quella distanza?

ingframin
08-06-2013, 15:41
Io ho inteso la distanza come il numero di step a partire dal nodo radice.
In effetti credo di avere inteso male la domanda, nel senso che ho capito:
"stampare tutti i nodi fino al raggiungimento della distanza".
Per stampare solo quelli a distanza n basta usare il mio procedimento passando come parametro n+1 e poi usare print solo quando il contatore arriva a 0.
Mi sa che ho preso una piccola cantonata stamattina :doh:

Katastrophe1602
08-06-2013, 15:59
whoa, che rapidità : P
grazie delle risposte, riguardo la prima ci devo ragionare ancora su.
la seconda l'ho sistemata per farla funzionare : P

public void print(int distanza, Albero a){
if (a!= null)
print(1, distanza, a);
else System.out.println("Albero vuoto");
}
private void print(int current,int distanza, Albero nodo){
if(nodo!=null)
if (current == distanza)
System.out.println(nodo.val);
else{
if (nodo.left != null)
print(current + 1, distanza, nodo.left);
if (nodo.right != null)
print(current + 1, distanza, nodo.right);
}
}

clockover
08-06-2013, 16:28
whoa, che rapidità : P
grazie delle risposte, riguardo la prima ci devo ragionare ancora su.
la seconda l'ho sistemata per farla funzionare : P

public void print(int distanza, Albero a){
if (a!= null)
print(1, distanza, a);
else System.out.println("Albero vuoto");
}
private void print(int current,int distanza, Albero nodo){
if(nodo!=null)
if (current == distanza)
System.out.println(nodo.val);
else{
if (nodo.left != null)
print(current + 1, distanza, nodo.left);
if (nodo.right != null)
print(current + 1, distanza, nodo.right);
}
}

Si ma fammi il piacere di indentare il codice. Come vedi le due risposte che hai ricevuto con il codice sono ordinate. Aiutaci ad aiutarti. Ci sono delle discussioni su questo forum che personalmente non prendo neanche in considerazione solo perchè il codice non è indentato.

Katastrophe1602
08-06-2013, 16:49
si scusate, nn trovavo come inserire il codice : P ho notato ora che toglie i tab inserendolo senza.

public void print(int distanza, Albero a){
if (a!= null)
print(1, distanza, a);
else System.out.println("Albero vuoto");
}
private void print(int current,int distanza, Albero nodo){
if(nodo!=null)
if (current == distanza)
System.out.println(nodo.val);
else{
if (nodo.left != null)
print(current + 1, distanza, nodo.left);
if (nodo.right != null)
print(current + 1, distanza, nodo.right);
}
}

comunque è funzionante, con questo ho finito gli esercizi delativi all'argomento, ora passerò alla gestione di liste.
grazie mille penso che il topic sia risolto