Il est assez difficile de faire un vrai générique de l'arbre de la mise en œuvre en Java, vraiment séparé de l'arbre des opérations et des propriétés de la implémentations sous-jacentes, c'est à dire de le remplacer par un RedBlackTreeNode et de remplacer une couple de méthode pour obtenir un RedBlackTree mise en œuvre, tout en conservant tous les génériques des opérations qu'un BinaryTree interface contient.
Aussi, un idéal, une abstraction serait en mesure de remplacer le faible niveau de représentation en arborescence, par exemple implicite de l'arbre binaire de la structure stockées dans un tableau pour un Segment ou un Nœud d'interface de base à gauche et à droite de l'enfant pointeurs, ou de plusieurs enfants de pointeurs, ou de les augmenter tout de ce qui précède avec les parents des pointeurs, ou d'enfiler les nœuds feuilles, etc, etc, etc.
J'ai essayer de le résoudre moi-même, mais a terminé avec un peu plus compliquée interface qui applique encore la sécurité de type. Voici le squelette de l'idée qui définit un résumé BinaryTree classe avec un non-trivial de fonctionnement (Euler Tour) qui fonctionne même si le nœud sous-jacent de classe ou de classe de l'arbre est changé. Il probable pourrait être améliorée par l'introduction de l'idée de curseurs pour la navigation et les positions au sein de la structure de l'arbre:
public interface Tree<E, P extends Tree.Entry<E, P>> extends Collection<E>
{
public P getRoot();
public Collection<P> children(P v);
public E getValue(P v);
public static interface Entry<T, Q extends Entry<T, Q>> { }
}
public interface BinaryTree<E, P extends BinaryTree.Entry<E, P>> extends Tree<E, P>
{
public P leftChild(P v);
public P rightChild(P v);
public static interface Entry<T, Q extends Entry<T, Q>> extends Tree.Entry<T, Q>
{
public Q getLeft();
public Q getRight();
}
}
public interface TreeTraversalVisitor<E, P extends BinaryTree.Entry<E, P>, R>
{
public R visitLeft( BinaryTree<E, P> tree, P v, R result );
public R visitCenter( BinaryTree<E, P> tree, P v, R result );
public R visitRight( BinaryTree<E, P> tree, P v, R result );
}
public abstract class AbstractBinaryTree<E, P extends BinaryTree.Entry<E, P>> extends AbstractCollection<E> implements BinaryTree<E, P>
{
public Collection<P> children( P v )
{
Collection<P> c = new ArrayList<P>( 2 );
if ( hasLeft( v ))
c.add( v.getLeft());
if ( hasRight( v ))
c.add( v.getRight());
return c;
}
/**
* Performs an Euler Tour of the binary tree
*/
public static <R, E, P extends BinaryTree.Entry<E, P>>
R eulerTour( BinaryTree<E, P> tree, P v, TreeTraversalVisitor<E, P, R> visitor, R result )
{
if ( v == null )
return result;
result = visitor.visitLeft( tree, v, result );
if ( tree.hasLeft( v ))
result = eulerTour( tree, tree.leftChild( v ), visitor, result );
result = visitor.visitCenter( tree, v, result );
if ( tree.hasRight( v ))
result = eulerTour( tree, tree.rightChild( v ), visitor, result );
result = visitor.visitRight( tree, v, result );
return result;
}
}