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;
};



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值