|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Junior Member
Iscritto dal: Jun 2013
Messaggi: 3
|
[Java] metodi ricorsivi
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 |
![]() |
![]() |
![]() |
#2 | |
Senior Member
Iscritto dal: Apr 2010
Città: Leuven
Messaggi: 667
|
Quote:
Codice:
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); } } A parte gli scherzi, se non ti è chiaro te lo spiego con più dettagli ![]()
__________________
L'elettronica digitale non esiste, è solo elettrotecnica con interruttori piccoli! ![]() |
|
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1945
|
Io l'avrei fatto così, non l'ho provato ma più o meno dovrebbe essere così
Codice:
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) } 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? |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Apr 2010
Città: Leuven
Messaggi: 667
|
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 ![]()
__________________
L'elettronica digitale non esiste, è solo elettrotecnica con interruttori piccoli! ![]() |
![]() |
![]() |
![]() |
#5 |
Junior Member
Iscritto dal: Jun 2013
Messaggi: 3
|
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); } } |
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1945
|
Quote:
|
|
![]() |
![]() |
![]() |
#7 |
Junior Member
Iscritto dal: Jun 2013
Messaggi: 3
|
si scusate, nn trovavo come inserire il codice : P ho notato ora che toglie i tab inserendolo senza.
Codice:
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); } } grazie mille penso che il topic sia risolto |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 14:30.