问题描述:
给定一个用逗号分隔的字符串,验证它是否是二叉树的正确的前序遍历序列。 找到一个不用重建树的算法。字符串中的每两个逗号之间必须是整数或表示空指针的字符'#'。
解题思路:
Example 1:
"9,3,4,#,#,1,#,#,2,#,6,#,#"
Return true
根据例子,可以得到一种简单的思路:先用vector<string>存储每两个逗号之间的内容。遍历这个容器,如果出现“1,#,#”这种情况,则可以将其用“#”代替,不断重复这个过程。如果最后剩下的是“#”,则返回TRUE,否则返回FALSE。
源代码如下:
class Solution {
public:
bool isValidSerialization(string preorder) {
vector<string> preorder0;
string temp="";
for(int i=0;i<preorder.size();i++)
{
if(preorder[i]!=',')
temp+=preorder[i];
else
{
preorder0.push_back(temp);
temp="";
}
}
preorder0.push_back(temp);
stack<string> stk;
for(int i=0;i<preorder0.size();i++)
{
if(preorder0[i]!="#")
stk.push(preorder0[i]);
else
{
if(stk.empty()) stk.push(preorder0[i]);
else if(!stk.empty()&&stk.top()!="#") stk.push(preorder0[i]);
else
{
while(!stk.empty()&&stk.top()=="#")
{
stk.pop();
if(stk.empty()) return false;
stk.pop();
}
stk.push("#");
}
}
}
return stk.size()==1&&stk.top()=="#";
}
};
public:
bool isValidSerialization(string preorder) {
vector<string> preorder0;
string temp="";
for(int i=0;i<preorder.size();i++)
{
if(preorder[i]!=',')
temp+=preorder[i];
else
{
preorder0.push_back(temp);
temp="";
}
}
preorder0.push_back(temp);
stack<string> stk;
for(int i=0;i<preorder0.size();i++)
{
if(preorder0[i]!="#")
stk.push(preorder0[i]);
else
{
if(stk.empty()) stk.push(preorder0[i]);
else if(!stk.empty()&&stk.top()!="#") stk.push(preorder0[i]);
else
{
while(!stk.empty()&&stk.top()=="#")
{
stk.pop();
if(stk.empty()) return false;
stk.pop();
}
stk.push("#");
}
}
}
return stk.size()==1&&stk.top()=="#";
}
};