各ノードがビットであるツリーと考えることができます。各クエスチョン マークは、0 と 1 の 2 つのノードを生成します。クエスチョン マークでないものはすべて、同じ値を持つ単なるノードです。たとえば、 の入力の10?1?
場合、ツリーは次のように展開されます。

C の実装は次のとおりです。
void generate_str(char *str, int pos) {
if (str[pos] == '\0') {
printf("%s\n", str);
return;
}
if (str[pos] == '?') {
str[pos] = '0';
generate_str(str, pos+1);
str[pos] = '1';
generate_str(str, pos+1);
str[pos] = '?'; /* We can get back to this branch because of an earlier '?' */
}
else {
generate_str(str, pos+1);
}
}
位置を「?」に戻す必要があることに注意してください。別のブランチから来た可能性があるため、そのブランチを探索した後、後で同じ位置に再び疑問符があることを認識する必要があります。
この関数は次のように呼び出すことができます。
int main(void) {
char test[] = "10?1?";
generate_str(test, 0);
return 0;
}
O(2^n)
少なくとも出力を印刷する必要があるため、より良いことはできません。