Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Verifica se l'albero binario è triangolare [Java]

Linguaggi e sistemi

Moderatori: Foto UtentePaolino, Foto Utentefairyvilje

0
voti

[1] Verifica se l'albero binario è triangolare [Java]

Messaggioda Foto UtentePatras » 31 lug 2017, 10:35

Ciao a tutti! Ho un dubbio riguardo a un algoritmo che ho appena scritto. Mi sembra troppo breve rispetto alle alternative della soluzione quindi forse ho sbagliato ma non trovo l'errore.
Forse i confronti con null non vanno bene?. E' da un sacco che non studio java
La mia idea è che se un albero binario è triangolare, allora lo sono anche i sui sotto-alberi. A quanto pare risulta O(n).

La consegna è :
Immagine

Codice: Seleziona tutto
static <T> boolean isTriangular(BinaryTree<T> a)
{
   return isTriangularPos(a.root());
}

static <T> boolean isTriangularPos(Position<T> v)
{
   if(v.hasLeft()&&v.hasRight())
   {
      if (v.left().isExternal()||v.right().isExternal())
         return v.left().isExternal()==v.right().isExternal();
      return isTriangularPos(v.left())&&isTriangularPos(v.right());
   }
   return v.hasLeft()==v.hasRight();
}
Avatar utente
Foto UtentePatras
51 1 7
Utente disattivato per decisione dell'amministrazione proprietaria del sito
 
Messaggi: 131
Iscritto il: 24 mag 2017, 15:27

0
voti

[2] Re: Verifica se l'albero binario è triangolare [Java]

Messaggioda Foto UtentePatras » 1 ago 2017, 13:58

Apposto, risolto
Avatar utente
Foto UtentePatras
51 1 7
Utente disattivato per decisione dell'amministrazione proprietaria del sito
 
Messaggi: 131
Iscritto il: 24 mag 2017, 15:27

1
voti

[3] Re: Verifica se l'albero binario è triangolare [Java]

Messaggioda Foto UtenteAjeieBrazov » 1 ago 2017, 18:03

Beh, potresti postare la soluzione.
Magari può essere interessante per altri utenti.
Avatar utente
Foto UtenteAjeieBrazov
1.460 4 10
---
 
Messaggi: 586
Iscritto il: 23 mag 2017, 21:53

1
voti

[4] Re: Verifica se l'albero binario è triangolare [Java]

Messaggioda Foto UtentePatras » 2 ago 2017, 17:44

AjeieBrazov ha scritto:Beh, potresti postare la soluzione.


Volentieri ma in realtà non l'ho risolto, ho solo trovato l'errore.
Ho appena riprovato e ho costruito un altro metodo, che non ha il problema di prima ovvero tiene conto delle altezze.
Voglio verificare che le radici dei due sotto-alberi considerati, presi in maniera ricorsiva partendo dalle foglie, abbiano la stessa altezza o detto in altre parole verifico che le altezze de fratelli siano uguali, condizione necessaria per un albero triangolare. Verifico anche che i fratelli ci siano entrambi o non ci siano proprio.
Non ho controllato i casi degeneri (1, 3 nodi, albero vuoto) perché non ho tempo.
Se tutto va bene alla fine restituisco l'altezza dell'albero, che non può essere maggiore/uguale al numero totale di nodi (size()), condizione che sfrutto per identificare quando l'albero non è triangolo.
Size() ha prestazioni temporali O(1)
Se qualcuno dà un occhiata mi fa una grande cortesia.
Codice: Seleziona tutto
static <T> boolean isTriangular(BinaryTree<T> a)
{
   return depth(a.root(),a.size())>a.size();
}

static <T> int depth (Position<T> v, int s)
{
   int left = 0;
   int right = 0;
   int dim=s;
   if(v.hasLeft()&&v.hasRight())
   {
      left=1+depth(v.left(),dim);
      right=1+depth(v.right(),dim);
      if(left==right)
         return left;
      return dim;                       //altezze diverse, non triangolare
   }
   if(v.hasLeft()==v.hasRight())   //entrambe false, una foglia
      return 0;
   return dim;                 //un nodo che ha un solo figlio, non triangolare
}

Avatar utente
Foto UtentePatras
51 1 7
Utente disattivato per decisione dell'amministrazione proprietaria del sito
 
Messaggi: 131
Iscritto il: 24 mag 2017, 15:27


Torna a PC e informatica

Chi c’è in linea

Visitano il forum: Nessuno e 12 ospiti