google面试题之不构造树的情况下验证先序遍历
2016-06-24 10:13
369 查看
题目如下所示:给出一个字符序列,问该序列是否是一棵合法的二叉树的先序遍历?
找到一种不需要构造二叉树的方法。
For example:
"9,3,4,#,#,1,#,#,2,#,6,#,#"
是下面这颗二叉树的先序遍历。其中#代表空节点。
代码一如下:(合法的二叉树中叶子节点后跟两个空节点(#),去掉叶子节点后的二叉树仍然为合法的二叉树,因此将叶子节点替换为空节点,判断最后剩下的节点是否为一个空节点)
代码二如下:(合法二叉树中度为2的节点数等于叶子节点数加1)
找到一种不需要构造二叉树的方法。
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; };