@Override
 void delEdge(Edge<T> e) {
   getFathers.remove(e.getFather(), e.getSon());
   Node<T> father = getFather(e.getSon());
   Node<T> n = tNode.get(e.getSon());
   if (father == null) {
     tree.remove(n);
   } else if (father != n.getFather()) {
     tree.move(father, n);
   }
 }
 boolean takeFirst(Node<T> a, Node<T> b) {
   if (a == null) {
     return false;
   }
   if (b == null) {
     return true;
   }
   if (b.getLevel() > a.getLevel()) {
     return true;
   }
   return (b.getLevel() == a.getLevel()
       && ((Comparable<T>) b.getValue()).compareTo(a.getValue()) > 0);
 }
  @Override
  void addEdge(Edge<T> e) {

    Node<T> fatherN = tNode.get(e.getFather());
    Node<T> son = tNode.get(e.getSon());

    /*
     * Vérifie qu'il n'a pas déjà un père et un autre.
     */

    if (son != null
        && (son.getFather() != null || !son.getFather().getValue().equals(e.getFather()))) {
      if (takeFirst(fatherN, son.getFather())) {
        /*
         * On déplace si le level est plus petit si les level sont egaux
         * on prend T du père en compte
         */
        tree.move(fatherN, son);
      }
    } else {
      Node<T> n = tree.add(fatherN, e);
      tNode.put(n.getValue(), n);
    }
  }