// TODO this.majorants should return an iterator
public Node<N> join(Node<N> x, Node<N> y) {
        // TODO this.majorants should return an iterator
        SortedSet<Node<N>> xMajorants = new TreeSet<Node<N>>(this.majorants(x));
        xMajorants.add(x);
        SortedSet<Node<N>> yMajorants = new TreeSet<Node<N>>(this.majorants(y));
        yMajorants.add(y);
        xMajorants.retainAll(yMajorants);
        DAGraph<N, E> graph = this.getSubgraphByNodes(xMajorants);
        TreeSet<Node> join = new TreeSet<Node>(graph.min());
        if (join.size() == 1) {
            return join.first();
        }
        return null;
    }
public Node<N> join(Node<N> x, Node<N> y) {
// TODO this.majorants should return an iterator
SortedSet<Node<N>> xMajorants = new TreeSet<Node<N>>(this.majorants(x));
xMajorants.add(x);
public Node<N> join(Node<N> x, Node<N> y) {
// TODO this.majorants should return an iterator
SortedSet<Node<N>> xMajorants = new TreeSet<Node<N>>(this.majorants(x));
xMajorants.add(x);
SortedSet<Node<N>> yMajorants = new TreeSet<Node<N>>(this.majorants(y));
yMajorants.add(y);
xMajorants.retainAll(yMajorants);
DAGraph<N, E> graph = this.getSubgraphByNodes(xMajorants);
TreeSet<Node> join = new TreeSet<Node>(graph.min());
if (join.size() == 1) {
return join.first();
}
public Node<N> join(Node<N> x, Node<N> y) {
// TODO this.majorants should return an iterator
SortedSet<Node<N>> xMajorants = new TreeSet<Node<N>>(this.majorants(x));
xMajorants.add(x);
SortedSet<Node<N>> yMajorants = new TreeSet<Node<N>>(this.majorants(y));
yMajorants.add(y);
xMajorants.retainAll(yMajorants);
DAGraph<N, E> graph = this.getSubgraphByNodes(xMajorants);
TreeSet<Node> join = new TreeSet<Node>(graph.min());
if (join.size() == 1) {
return join.first();
}
return null;
}