331. Verify Preorder Serialization of a Binary Tree
题目:给定一个binary tree的 preorder表达式,判断是否是一颗binary tree, 空节点用#表示
思路1:看到这题第一反应就是用stack,当扫描到'#'的时候如果stack的top也是'#',那么pop掉stack顶端的两个元素
比如stack里面原来有"4,#", 这时候扫描到一个'#', 那么stack就变成"#"
代码如下
bool isValidSerialization(string preorder) {
<span style="white-space:pre"> </span>int n = preorder.size();
if(n == 0) return true;
vector<string> v;
int pos = -1;
for(int i = 0; i < n; i++)
{
if(preorder[i] == ',')
{
v.push_back(preorder.substr(pos+1, i-pos-1));
pos = i;
}
}
if(preorder[n-1] != '#') return false;
v.push_back("#");
stack<string> stk;
for(int i = 0; i < v.size(); i++)
{
string cur = v[i];
if(cur == "#")
{
while(!stk.empty() && stk.top() == "#" && stk.size() > 1)
{
cout<<"pop: "<<stk.top()<<endl;
stk.pop();
if(stk.top() == "#") return false;
stk.pop();
}
}
cout<<"push: "<<cur<<endl;
stk.push(cur);
}
if(stk.top() != "#") return false;
stk.pop();
return stk.empty();
}
思路2:一颗空树应该有1个‘#’,在此基础上每增加一个非空节点时'#'的数量+1。
扫描一遍输入,初始cnt=1,碰到'#'时cnt--, 否则cnt++, 在扫描到结束之前如果cnt==0那么返回false。扫描一遍后如果cnt==0那么返回true,否则返回false
代码:
bool isValidSerialization(string preorder) {
int n = preorder.size();
if(n == 0) return true;
vector<string> v;
int pos = -1;
for(int i = 0; i < n; i++)
{
if(preorder[i] == ',')
{
v.push_back(preorder.substr(pos+1, i-pos-1));
pos = i;
}
}
if(preorder[n-1] != '#') return false;
v.push_back("#");
int cnt = 1;
for(int i = 0; i < v.size(); i++)
{
if(cnt <= 0) return false;
if(v[i] == "#") cnt -= 1;
else cnt += 1;
}
return cnt == 0;
}