2016-12-01 91 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

看一看hereoperator>>(char)沒有超載,它可能被隱式轉換爲別的東西。這是您編寫的代碼的預期行爲。

+0

當我更改它時到int鍵;我仍然看到:333.我沒有期望,因爲我已經提取了整數。從評論我來知道它返回整個底層緩衝區。 –

相關問題