如果只给一个前序遍历,是不能构造出二叉树的,但是把空节点也加上,就可以唯一构造一个二叉树,按要求模拟一遍:
代码的执行过程被唯一限制住,还有一类是最优化问题,用算法解决该类问题。
class Solution {
public:
int k = 0;
string s;
bool isValidSerialization(string preorder) {
s = preorder + ','; // 保持格式一致, 在末尾加上逗号
if (!dfs()) return false; // 如果中间出错 返回false
return k == s.size(); // 最后判断时, 不能有多余的元素
}
bool dfs () {
if (k == s.size()) return false; // 此时应该要有元素,没有则创建失败
if (s[k] == '#') return k += 2, true; // 逗号表达式 返回最后一个表达式的值, 写相当于写{k += 2; return true;}
while (s[k] != ',') k++; // 遍历这个节点
k++; //遍历结束 删除逗号
return dfs() && dfs (); // 遍历左子树 以及 右子树
}
};