public String row(int i)
    throws Exception
  {
    int lh = this.left.height();
    int rh = this.right.height();
    int h = Math.max(lh, rh);

    // Sanity check
    if ((i < 0) || (i >= h))
      {
        throw new Exception("Invalid row " + i);
      } // if the row is invalid

    String result;
    if (i < lh)
      {
        result = this.left.row(i);
      } // if the left half contains an ith row
    else
      {
        result = TBUtils.spaces(this.left.width());
      } // if the left half does not contain an ith row

    if (i < rh)
      {
        result = result.concat(this.right.row(i));
      } // if the right half contains an ith row
    else
      {
        result = result.concat(TBUtils.spaces(this.right.width()));
      } // if the right half does not contain an ith row
    return result;
  } // row(int)