code: public ADTNode<S, I, O> splitLeaf(final ADTNode<S, I, O> nodeToSplit,
                                        final Word<I> distinguishingSuffix,
                                        final Word<O> oldOutput,
                                        final Word<O> newOutput) {
  
          if (!ADTUtil.isLeafNode(nodeToSplit)) {
              throw new IllegalArgumentException("Node to split is not a final node");
          }
          if (!(distinguishingSuffix.length() == oldOutput.length() && oldOutput.length() == newOutput.length())) {
              throw new IllegalArgumentException("Distinguishing suffixes and outputs differ in length");
          }
          if (oldOutput.equals(newOutput)) {
              throw new IllegalArgumentException("Old and new output are equal");
          }
  
          final boolean wasRoot = this.root.equals(nodeToSplit);
  
          final ADTNode<S, I, O> result =
                  this.leafSplitter.split(nodeToSplit, distinguishingSuffix, oldOutput, newOutput);
  
          if (wasRoot) {
              this.root = ADTUtil.getStartOfADS(nodeToSplit);
          }
  
          return result;
      }
docs: Splits a leaf node using the local {@link LeafSplitter}.
  
  @param nodeToSplit
  the leaf node to split
  @param distinguishingSuffix
  the input sequence that splits the hypothesis state of the leaf to split and the new node
  @param oldOutput
  the hypothesis output of the node to split given the distinguishing suffix
  @param newOutput
  the hypothesis output of the new leaf given the distinguishing suffix
  
  @return the new leaf node