[JAVA] Vari metodi su Alberi e Liste
Ciao a tutti!
Ho alcuni metodi su Alberi binari e Liste che non mi vengono, mi date una mano?
Classe BinaryTree (ha una classe interna BinaryNode in cui solitamente scrivo i metodi ricorsivi):
Classe Lista:
Ho provato a fare mille modifiche ma non mi vengono..
Grazie!
Ho alcuni metodi su Alberi binari e Liste che non mi vengono, mi date una mano?
Classe BinaryTree (ha una classe interna BinaryNode in cui solitamente scrivo i metodi ricorsivi):
public class BinaryTree { private BinaryNode root; public static class BinaryNode { private int dato; private BinaryNode left = null; private BinaryNode right = null; public BinaryNode(int dato, BinaryNode left, BinaryNode right) { this.dato = dato; this.left = left; this.right = right; } public BinaryNode(int dato) { this.dato = dato; } public BinaryNode(int dato, int left, int right) { this.dato = dato; this.left = new BinaryNode(left); this.right = new BinaryNode(right); } public String toString() { return dato + " " + left + " " + right; } //..più vari metodi get e set ed altri metodi.. METODI CHE NON MI VENGONO /* deve restituire il numero di nodi discendenti del nodo di valore val il cui valore è multiplo di val Se l'abero è vuoto o non contiene nodo di valore v il metodo restituisce -1 */ public int contaMultipliDiValSottoalbero(int val) { int cont = 0; if (this.dato == val) { if (left != null && right == null) { if (left.dato % val == 0) cont = cont + left.contaMultipliDiValSottoalbero(val) + 1; else cont = cont + left.contaMultipliDiValSottoalbero(val); } else if (left == null && right != null) { if (right.dato % val == 0) cont = cont + right.contaMultipliDiValSottoalbero(val) + 1; else cont = cont + right.contaMultipliDiValSottoalbero(val); } else if (left != null && right != null) { if (left.dato % val == 0) cont = cont + left.contaMultipliDiValSottoalbero(val) + 1; else if (right.dato % val == 0) cont = cont + right.contaMultipliDiValSottoalbero(val) + 1; else if (left.dato % val != 0) cont = cont + left.contaMultipliDiValSottoalbero(val); else //if (right.dato % val != 0) cont = cont + right.contaMultipliDiValSottoalbero(val); } } else { if (left != null && right != null) cont = cont + left.contaMultipliDiValSottoalbero(val) + right.contaMultipliDiValSottoalbero(val); if (left != null && right == null) cont = cont + left.contaMultipliDiValSottoalbero(val); if (left == null && right != null) cont = cont + right.contaMultipliDiValSottoalbero(val); } return cont; } /* Conta i nodi che hanno profondita' >= la profondita' passata. La radice ha profondita' 0. (Non so come farlo) */ public int contaOltreProfondita() { if () } */ } public BinaryTree() { root = null; } public BinaryTree(BinaryNode root) { this.root = root; } public BinaryNode getRoot() { return(root); } public void setRoot(BinaryNode node) { root = node; } // ..altri metodi .. METODI DI PRIMA CHE NON MI VENGONO /* public int contaMultipliDiValSottoalbero(int val) { if (root == null || !this.member(val)) return -1; return root.contaMultipliDiValSottoalbero(val); } */ /* public int[] contaOltreProfondita(int val) { if (prof > this.height()) { System.out.println("Profondità massima dell'albero superata"); return -1; } } */ }
Classe Lista:
class Lista { private Node first; public Lista() { first = null; } public Lista(Node node) { first = node; } // .. altri metodi ... // Cancella tutti i nodi con valore uguale a quello passato /*public void cancellaTuttiUgualiVal(int val) { if (first == null) return; if (first.equals(val)) first = first.getNext(); Node iterator = first; while (iterator.getNext() != null) { if (iterator.getNext().getCargo() == val) { iterator.setNext(iterator.getNext().getNext()); iterator = iterator.getNext(); } else iterator = iterator.getNext(); } } */ /* restituisce il numero di elementi della più lunga sottolista di elementi con parte cargo negativa all'interno della lista corrente. se la lista è vuota restituisce 0 Es: -3, -13, 22, -27, 28 --> lista.sequenzaNegativa() --> restituisce 2 public int sequenzaNegativa() { if (first == null) return -1; int cont = 0; Node iterator = first; while (iterator != null || iterator.getNext.getCargo() > 0) { if (iterator.getCargo() < 0) cont ++; } }*/ // Inserisce un nodo x dopo il nodo y se x = somma dei successivi nodi di y. Restiruisce un booleano // Es: 3,6,2,4,1 --> lista.inserisciSe(7,6) --> true // Es: 3,6,2,4,1 --> lista.inserisciSe(8,2) --> false public boolean inserisciSe(int x, int y) { if (first == null) return false; boolean bool = false; Node iterator = first; while (iterator != null) { if (iterator.getCargo() == y) { int sum = 0; while (iterator != null) { sum = sum + iterator.getNext().getCargo(); } if (sum == x) { iterator.setNext(new Node(x, iterator.getNext())); bool = true; } else iterator = iterator.getNext(); } else iterator = iterator.getNext(); } return bool; } // Se la lista è vuota o non contiene val restituisce true. Se lista contiene val guarda tutti i suo elementi successivi, se sono tutti multipli di val restituisce true altrimenti false. public boolean tuttiSuccessoriMultipliVal(int val) { if (first == null || !this.member(val)) return true; boolean bool = false; Node iterator = first; Node iterator1 = first; while (iterator != null) { if (iterator.getCargo() == val) { while (iterator1 != null) { if (iterator1.getNext().getCargo() % val == 0) { bool = true; } else bool = false; } } else { iterator = iterator.getNext(); iterator1 = iterator1.getNext(); } } return bool; } }
Ho provato a fare mille modifiche ma non mi vengono..

Grazie!
Risposte
Che cosa significa che non ti vengono? Che cosa non riesci a fare/capire? Incontri un qualche errore di compilazione? Durante l'esecuzione? Oppure non sai come implementare una qualche funzionalità?
Non danno errori ma non fanno ciò che vorrei...
Per esempio "contaNodiMaggioriVal" mi restituisce un valore errato e non capisco con quale criterio.. qualche aiuto?
Vediamone uno alla volta!
richiamato da:
in questo commentami cosa pensi avvenga nel codice.
Mi pare che la metodologia ricorsiva non sia definita molto bene.
deve restituire il numero di nodi discendenti del nodo di valore val il cui valore è multiplo di val
Se l'abero è vuoto o non contiene nodo di valore v il metodo restituisce -1
public int contaMultipliDiValSottoalbero(int val) { int cont = 0; if (this.dato == val) { if (left != null && right == null) { if (left.dato % val == 0) cont = cont + left.contaMultipliDiValSottoalbero(val) + 1; else cont = cont + left.contaMultipliDiValSottoalbero(val); } else if (left == null && right != null) { if (right.dato % val == 0) cont = cont + right.contaMultipliDiValSottoalbero(val) + 1; else cont = cont + right.contaMultipliDiValSottoalbero(val); } else if (left != null && right != null) { if (left.dato % val == 0) cont = cont + left.contaMultipliDiValSottoalbero(val) + 1; else if (right.dato % val == 0) cont = cont + right.contaMultipliDiValSottoalbero(val) + 1; else if (left.dato % val != 0) cont = cont + left.contaMultipliDiValSottoalbero(val); else //if (right.dato % val != 0) cont = cont + right.contaMultipliDiValSottoalbero(val); } } else { if (left != null && right != null) cont = cont + left.contaMultipliDiValSottoalbero(val) + right.contaMultipliDiValSottoalbero(val); if (left != null && right == null) cont = cont + left.contaMultipliDiValSottoalbero(val); if (left == null && right != null) cont = cont + right.contaMultipliDiValSottoalbero(val); } return cont; }
richiamato da:
public int contaMultipliDiValSottoalbero(int val) { if (root == null || !this.member(val)) return -1; return root.contaMultipliDiValSottoalbero(val); }
in questo commentami cosa pensi avvenga nel codice.
Mi pare che la metodologia ricorsiva non sia definita molto bene.
il problema è che mi sono incasinata da sola e quindi non riesco a farlo..