思路:空节点(#)比非空节点数量多1,可以用栈来判断,每次遇到非空节点,栈内元素加1, 遇到空节点栈内元素减1。当遇到空节点且此时栈已经是空栈时,该节点必是最后一个节点,否则该序列不是二叉树的前序遍历。
class Solution {
public:
bool isValidSerialization(string preorder) {
stack<bool> stk; //栈内放什么无所谓,一个填充物即可
for (int i = 0; i < preorder.size(); i ++ )
{
if (preorder[i] == '#') //每当遍历到空节点,弹出栈顶元素
{ //若栈已经为空,判断是否已经抵达最后一个节点
if (stk.empty()) return i == preorder.size() - 1;
else
{
stk.pop();
i ++ ; //跳过逗号
}
}
else
{
while (i < preorder.size() && preorder[i] != ',') i ++ ; //遍历完整数字
stk.push(0); //塞入填充物
}
}
return false;
}
};
我觉得这个代码才应该是最好的代码
栈模拟最清晰了