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

변경하면 333. 정수를 이미 추출 했으므로 아무 것도 기대하지 않았습니다. 주석에서 정수가 전체 버퍼를 반환한다는 것을 알게되었습니다. –