题目链接:https://leetcode-cn.com/problems/verify-preorder-serialization-of-a-binary-tree/
1、栈
bool isValidSerialization(string preorder) {
string buf;
stack<string> s;
if (preorder == "#") return true;
istringstream is(preorder);
getline(is, buf, ',');
s.push(buf);
while (!s.empty() && getline(is, buf, ',')){
while (!s.empty()){
if (buf == "#" && s.top() == "#"){//连续的##则弹栈
s.pop();
if (s.empty()) {
return false;
}else{
s.pop();
}
}else{
s.push(buf);
break;
}
}
}
if (s.empty() && is.eof()){
return true;
}else{
return false;
}
}
2、度
判断出入度是否相同。
设出度为-1,入度为+1,把#看成叶子节点,那么叶子节点的度数为+1,非叶子节点为-1,根节点为-2,最后结果为0表明出入度相同,即为正确的二叉树。
bool isValidSerialization(string preorder) {
string buf;
istringstream is(preorder);
int degree = -1;
while (getline(is, buf, ',')){
if (degree == 0) return false;//排除#,#和3,#,#,#,#这类情况
if (buf == "#"){
degree += 1;
}else {
degree -= 1;
}
}
return (degree == 0);
}