Ciao a tutti, sto svolgendo deli esercizi sugli alberi binari ma alcuni di questi non mi funzionano. Posto il codice:
codice:
public class BinaryTree
{
protected class Node
{
Integer element;
Node left;
Node right;
Node(int element)
{
this.element = element;
left = right = null;
}
Node(int element, Node left, Node right)
{
this.element = element;
this.left = left;
this.right = right;
}
boolean isLeaf()
{
return left == null && right == null;
}
}
protected Node root;
public BinaryTree()
{
root = null;
}
public boolean isComplete()
{
return isComplete(root) > -2;
}
private int isComplete(Node node)
{
int hl;
int hr;
if(node == null)
return -1;
hl = isComplete(node.left);
hr = isComplete(node.right);
if(hl != hr)
return -2;
else
return 1 + Math.max(hl, hr);
}
private class BoolNode
{
boolean fatto;
Node nodo;
BoolNode(boolean fatto, Node nodo)
{
this.fatto = fatto;
this.nodo = nodo;
}
}
public boolean removeSubtree(int x)
{
BoolNode ris = removeSubtree(root, x);
root = ris.nodo;
return ris.fatto;
}
private BoolNode removeSubtree(Node node, int x)
{
if(node == null)
return new BoolNode(false, null);
if(node.element == x)
return new BoolNode(true, null);
BoolNode result = removeSubtree(node.left, x);
if(result.fatto)
node.left = null;
else {
result = removeSubtree(node.right, x);
node.right = null;
}
return new BoolNode(result.fatto, node);
}
}
Il metodo isComplete deve restituire true se l'albero e' completo, false altrimenti. Un albero e' completo se:
- tutti i livelli sono saturi tranne eventualmente l'ultimo
- l'ultimo livello e' riempito da sinistra verso destra.
Questo metodo funziona ma penso mi manchi un caso da considerare, cioè quando i due sottoalberi sono entrambi non compelti. Come devo modificare il codice in quel caso?
Il metodo removeSubtree invece elimina il sottoalbero di radice x. Se x è presente più volte, elimina uno solo dei sottoalberi. Se l'eliminazione è andata a buon fine restituisce true, se invece l'elemento non è presente restituisce false.
Questo metodo non funziona perchè se gli inserisco un albero del tipo
e gli metto x = 8, mi restituisce
L'errore è nelle due istruzioni sottolineate.. ma non so come modificarle..
Qualche aiuto?
Grazie