原题地址:https://leetcode-cn.com/problems/verify-preorder-serialization-of-a-binary-tree/submissions/
题目描述:
例如,上面的二叉树可以被序列化为字符串 "9,3,4,#,#,1,#,#,2,#,6,#,#",其中 # 代表一个空节点。
给定一串以逗号分隔的序列,验证它是否是正确的二叉树的前序序列化。编写一个在不重构树的条件下的可行算法。
每个以逗号分隔的字符或为一个整数或为一个表示 null 指针的 '#' 。
你可以认为输入格式总是有效的,例如它永远不会包含两个连续的逗号,比如 "1,,3" 。
示例 1:
输入: "9,3,4,#,#,1,#,#,2,#,6,#,#"
输出: true
示例 2:
输入: "1,#"
输出: false
示例 3:
输入: "9,#,#,1"
输出: false
解题方案:
使用栈能够解出这道题,但是需要考虑很多种情况:
class Solution {
public:
bool isValidSerialization(string preorder) {
stack<char> st;
if(preorder.size() == 0 || (preorder.size() == 1 && preorder[0] == '#'))
return true;
if(preorder.size() > 1 && preorder[0] == '#')
return false;
st.push(preorder[0]);
st.push(preorder[0]);
for(int i = 1; i < preorder.size(); i ++){
if(st.empty())
return false;
if(preorder[i] == ',')
continue;
st.pop();
if(preorder[i] != '#'){
st.push(preorder[i]);
st.push(preorder[i]);
while(preorder[i] != ',' && i < preorder.size())
i ++;
}
}
if(st.empty())
return true;
else
return false;
}
};
时间更短的解法:
class Solution {
public:
bool isValidSerialization(string preorder) {
istringstream in(preorder);
vector<string> v;
string t = "";
int cnt = 0;
while (getline(in, t, ',')) v.push_back(t);
for (int i = 0; i < v.size() - 1; ++i) {
if (v[i] == "#") {
if (cnt == 0) return false;
--cnt;
} else ++cnt;
}
return cnt == 0 && v.back() == "#";
}
};