私はこの問題をしています: https://leetcode.com/problems/verify-preorder-serialization-of-a-binary-tree/C++でこのようなワークフローを実現する最も良い方法は?
私のアプローチは、 "1、#2、#、#" のようなストリームにシリアライズされた文字列を割り当てることです。 そしてストリームから文字を読み込みます。それが '#'ならば戻ります。それ以外の場合は、 にアクセスしてください。私が誤って抽出された文字を削除するには、ストリームを期待するので
class Solution {
stringstream pre; int char_count = 0;
public:
bool visit() {
if (char_count >= pre.str().size()) return 0;
char key; char comma;
while (char_count < pre.str().size() && pre.peek() != ',') {
pre >> key;
char_count++;
}
if (pre.peek() == ',') {
pre >> comma;
char_count++;
}
if (key == '#') return 1;
return visit() && visit();
}
bool isValidSerialization(string preorder) {
pre << preorder;
cout << "preorder: " << preorder << endl;
if (!visit()) return 0;
if (pre.str().size() > char_count) return 0;
return 1;
}
};
int main() {
Solution q;
cout << q.isValidSerialization("1,#,#");
}
以前、私は
if (!pre.str().size())
のためにチェックしていました。今はchar_countを維持していますが、コードはもはやエレガントではありません。 C++でこれを単純化する方法はありますか?
あなたは何をしようとしていますか? – sharyex
ストリームから1文字を抽出した後は33にしないでください。 –
'stringbuf :: str()'は、基礎となるバッファ全体を返します。 'q_s.str()。substr(q_s.tellg())'を実行してみてください。 – 0x499602D2