[JAVA] Vari metodi su Alberi e Liste

noipo
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):
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
apatriarca
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à?

noipo
Non danno errori ma non fanno ciò che vorrei...

noipo
Per esempio "contaNodiMaggioriVal" mi restituisce un valore errato e non capisco con quale criterio.. qualche aiuto?

hamming_burst
Vediamone uno alla volta!

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.

noipo
il problema è che mi sono incasinata da sola e quindi non riesco a farlo..

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.