@Override
  public ImmutableBinaryTree decompose(ArrayList<Vertex<Integer>> vertices) {
    Split split = createSplit(0, this, vertices);
    ArrayList<Vertex<Integer>> ordering = new ArrayList<>();

    while (!split.done()) {
      split = split.decomposeAdvance();
      ordering.add(split.getLastMoved());
    }

    // System.out.printf("ordering: %s\n", Util.labels(ordering));
    int i = 0;
    for (Vertex<Integer> v : ordering) {
      VertexLabel.setOrder(v, Integer.toString(i));
      i += 1;
    }
    return getCaterpillarIBTFromOrdering(ordering);
  }