2016-12-01 80 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.我没有期望,因为我已经提取了整数。从评论我来知道它返回整个底层缓冲区。 –

相关问题