题目如下所示:给出一个字符序列,问该序列是否是一棵合法的二叉树的先序遍历?
找到一种不需要构造二叉树的方法。
For example:
“9,3,4,#,#,1,#,#,2,#,6,#,#”
是下面这颗二叉树的先序遍历。其中#代表空节点。
代码一如下:(合法的二叉树中叶子节点后跟两个空节点(#),去掉叶子节点后的二叉树仍然为合法的二叉树,因此将叶子节点替换为空节点,判断最后剩下的节点是否为一个空节点)
var isValidSerialization = function(preorder) {
var a = preorder.split(",");
var len = a.length;
for(var i = 0; i<=a.length; i++){
if(i == a.length){
if(a.length < len){
i = 0;
len = a.length;
}else{
break;
}
}
if(a[i]!="#" && a[i+1] == "#" && a[i+2] == "#"){
a.splice(i,3,"#");
}
}
if(a.length == 1 && a[0] == "#"){
return true;
}else{
return false;
}
};
代码二如下:(合法二叉树中度为2的节点数等于叶子节点数加1)
var isValidSerialization = function(preorder) {
var nodes = preorder.split(',');
var i = 0, leaf = 1;
for(i = 0; i < nodes.length && leaf > 0; i++){
var node = nodes[i];
if(node !== '#'){
leaf++;
}else{
leaf--;
}
}
return leaf === 0 && i == nodes.length;
};