google面试题之不构造树的情况下验证先序遍历

题目如下所示:给出一个字符序列,问该序列是否是一棵合法的二叉树的先序遍历?
找到一种不需要构造二叉树的方法。
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;
};


点赞