题目描述
给出一个字符序列,问该序列是否是一棵合法的二叉树的先序遍历?
找到一种不需要构造二叉树的方法。
For example:
“9,3,4,#,#,1,#,#,2,#,6,#,#”
是下面这颗二叉树的先序遍历。其中#代表空节点。
分析解答
通过观察上图中二叉树我们可以发现,一棵合法的二叉树去掉某个叶子节点后仍是合法的二叉树。在给出的字符序列中,叶子节点有很明显的特征,即叶子节点之后一定紧跟两个空节点#。通过不断的把number,#,#的子串缩成空节点#(把number,#,#子串替换为#),如果最后字符序列可以缩短到只有一个字符#,那它就是我们要找的合法的先序遍历了。
参考程序
class Solution {
public:
bool isValidSerialization(string preorder) {
bool flag = true;
while (preorder.length() > 1) {
int index = preorder.find(",#,#");
if (index < 0) {
flag = false;
break;
}
int start = index;
while (start > 0 && preorder[start-1] != ',')
start--;
if (preorder[start] == '#') {
flag = false;
break;
}
preorder.erase(start, index-start+3);
}
return flag && preorder[0] == '#';
}
};
题目来源
LeetCode 331. Verify Preorder Serialization of a Binary Tree