@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); }