2016-12-01 12 views
0

私はこの問題をしています: 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++でこれを単純化する方法はありますか?

+0

あなたは何をしようとしていますか? – sharyex

+0

ストリームから1文字を抽出した後は33にしないでください。 –

+0

'stringbuf :: str()'は、基礎となるバッファ全体を返します。 'q_s.str()。substr(q_s.tellg())'を実行してみてください。 – 0x499602D2

答えて

1

hereをご覧ください。 operator>>(char)のオーバーロードはありません。暗黙的に他のものにキャストされている可能性があります。これはあなたが書いたコードの予想される動作です。

+0

私はすでに整数を抽出しているので、私は何も期待していませんでした。コメントから、基になるバッファ全体を返すことがわかりました。 –

関連する問題