Sto implementando un albero di ricerca binario in java. All'interno della classe BST ho un nodo di classe protetto (nel caso in cui voglio estendere ad un albero AVL). Il codice è sotto Ho avuto un problema, sia concettualmente che esteticamente, implementando i nodi vuoti come puntatori nulli. Così, invece, ho optato per il modello di oggetto nullo e creato un oggetto EmptyNode, il cui codice è anche sotto. Tuttavia, anche se questo mi dà un codice più grazioso e qualcosa di più concettualmente piacevole (per me), ora ho il problema che quando lavoro con un albero di altezza n, posso averne 2 ^ {n + 1} - 2 ^ {n} istanze di questa classe EmptyNode che fluttuano intorno, che occupa spazio senza una buona ragione.
Come dovrei risolvere questo codice per evitare questo sovraccarico continuando a implementare il modello di oggetto nullo? Mi sento come se il EmptyNode fosse qualcosa di concettualmente simile a un campo costante di Nodo, ma non posso implementarlo. Mi sembra anche che ci debba essere una sola copia di EmptyNode referenziata ovunque, ma non riesco a capire come implementarla. Qualsiasi aiuto o consiglio è apprezzato.
protected class Node<Key,E>{
protected Key key;
protected E value;
protected Node<Key,E> left;
protected Node<Key,E> right;
protected int height;
protected int balanceFactor;
public Node(){}
public Node(Key k, E v){
key = k;
value = v;
left = new EmptyNode<Key,E>();
right = new EmptyNode<Key,E>();
height = 0;
balanceFactor = 0;
}
public Node(Key k, E v, Node<Key,E> l, Node<Key,E> r){
key = k;
value = v;
left = l;
right = r;
height = Math.max(l.height(), r.height())+1;
balanceFactor = l.height() - r.height();
}
public Key getKey(){return key;}
public E getValue(){return value;}
public Node<Key,E> getLeft(){return left;}
public Node<Key,E> getRight(){return right;}
public int height(){return height;}
public int balanceFactor(){return balanceFactor;}
public void setKey(Key k){key = k;}
public void setValue(E v){value = v;}
public void setLeft(Node<Key,E> l){
left = l;
height = Math.max(l.height(), this.right.height())+1;
balanceFactor = left.height() - this.right.height();
}
public void setRight(Node<Key,E> r){
right = r;
height = Math.max(this.left.height(), r.height())+1;
balanceFactor = this.left.height() - right.height();
}
public boolean isEmpty(){return false;}
public boolean isLeaf(){
return (left.isEmpty()) && (right.isEmpty());
}
public boolean hasLeft(){
return !left.isEmpty();
}
public boolean hasRight(){
return !right.isEmpty();
}
}
protected final class EmptyNode<Key,E> extends Node<Key,E>{
public EmptyNode(){
key = null;
value = null;
left = right = null;
height = -1;
balanceFactor = 0;
}
@Override
public void setKey(Key k){}
@Override
public void setValue(E v){}
@Override
public void setLeft(Node<Key,E> l){}
@Override
public void setRight(Node<Key,E> r){}
@Override
public boolean isEmpty(){return true;}
@Override
public boolean isLeaf(){return false;}
@Override
public boolean hasLeft(){return false;}
@Override
public boolean hasRight(){return false;}
}