@Override
 public Gen<BinaryTree<Integer>> apply(int n) {
   return random ->
       Gen.choose(minValue, maxValue)
           .flatMap(
               value -> {
                 if (n == 0) {
                   return Gen.of(BinaryTree.leaf(value));
                 } else {
                   return Gen.frequency(
                       Tuple.of(1, Gen.of(BinaryTree.leaf(value))),
                       Tuple.of(
                           4,
                           Gen.of(
                               BinaryTree.branch(
                                   apply(n / 2).apply(random),
                                   value,
                                   apply(n / 2).apply(random)))));
                 }
               })
           .apply(random);
 }