class Solution { public: struct TreeNode { string val; TreeNode *left; TreeNode *right; TreeNode(string x) : val(x), left(NULL), right(NULL) {} }; bool isValidSerialization(string preorder) { int size = preorder.size(),i; for (i = 1; i <= size; i++) { if (preorder[i - 1] == ',') preorder[i - 1] = ' '; } stringstream ss; ss << preorder;
string sgn; while (ss >> sgn) { data.push_back(sgn); } if (int(data.size()) == 1) return data.back() == "#"; //判断data的先序序列化 return isValid(); } private: bool isValid() { int pos = 0; stack<TreeNode*> S; TreeNode* root=new TreeNode(""), *p = root; while (data[pos] != "#") { p->left = new TreeNode(data[pos++]); S.push(p->left); p = p->left; } while (!S.empty()) { p = S.top(); if (!p->left) { if (pos >= int(data.size())) return false; p->left = new TreeNode(data[pos++]); if (pos >= int(data.size())) return false; p->right = new TreeNode(data[pos++]); p = p->right; if (p->val != "#") { S.push(p); while (data[pos] != "#") { if (pos >= int(data.size())) return false; p->left = new TreeNode(data[pos++]); p = p->left; S.push(p); } } } else if(!p->right){ if (pos >= int(data.size())) return false; p->right = new TreeNode(data[pos++]); if (p->right->val == "#") continue; else { S.push(p->right); p = p->right; while (data[pos] != "#") { if (pos >= int(data.size())) return false; p->left = new TreeNode(data[pos++]); p = p->left; S.push(p); } } } else S.pop(); } return pos == int(data.size()); } vector<string> data; };
//方法2
class Solution { public: bool isValidSerialization(string preorder) { if (preorder.empty()) return true; int n = preorder.size(); int s = 1; for (int i = 0; i<n; ++i) { if (preorder[i] == '#') --s, ++i; else { for (; i<n && preorder[i] != ','; ++i); if (s == 0) return false; ++s; } if (s<0) return false; } return s == 0; } };