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;
}
};