如果只给一个前序遍历,是不能构造出二叉树的,但是把空节点也加上,就可以唯一构造一个二叉树,按要求模拟一遍:
代码的执行过程被唯一限制住,还有一类是最优化问题,用算法解决该类问题。
class Solution {
public:int k = 0;string s;bool isValidSerialization(string preorder) {s = preorder + ','; // 保持格式一致, 在末尾加上逗号if (!dfs()) return false; // 如果中间出错 返回falsereturn 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 (); // 遍历左子树 以及 右子树}
};