您的位置:首页 > 其它

331. Verify Preorder Serialization of a Binary Tree ~~~~~

2016-07-07 11:11 141 查看
方法一:

我自己的方法,建一个stack,每遇到数字就推进栈里,每遇到#,就弹出一个数字,最后栈里必须剩一个#。

public boolean isValidSerialization(String preorder) {
if(preorder == null || preorder.length() == 0) {
return false;
}
String[] res = preorder.split(",");
Stack<String> stack = new Stack<String>();
stack.push(res[res.length - 1]);
for(int i = 0; i < res.length - 1; i++) {
String each = res[i];
if("#".equals(each)) {
if(!stack.isEmpty()) {
stack.pop();
} else {
return false;
}
} else {
stack.push(each);
}
}
return !stack.isEmpty() && stack.peek().equals("#");
}


时间复杂度是O(n)

2. 别人的方法

每一个数字可以有两条发出的边,每个#会占用一条边,每一个数字自己本身会占用一个边,但是又会产生两个边,所以维持一个计数,一旦小于0就返回false。

注意的是:

1)这个数字初始化是1,相当于,一个根节点自己用掉1条是-1,又产生俩,所以加起来是1;

2)每遇到数字的时候,要把-1和+2分开做,如果-1的时候就小于0了,就返回false

public boolean isValidSerialization(String preorder) {
String[] res = preorder.split(",");
int count = 1;
for (String each : res) {
if (--count < 0) {
return false;
}
if (!"#".equals(each)) {
count += 2;
}
}
return count == 0;
}


时间复杂度是O(n)

方法三:

非常好看的方法,每一个叶节点的结构是“数字,#,#”,所以我们把所有的这样的格式都替换成一个“#”,不断地收缩,直到缩到最后应该是一个#。

public boolean isValidSerialization(String preorder) {
String after = preorder.replaceAll("\\d+,#,#", "#");
return after.equals("#") || !after.equals(preorder) && isValidSerialization(after);
}


第三行,之所以有“!after.equals(preorder)”,是因为比如一个不合法的树“1,2,3”,并没有“数字,#,#”这样的结构,所以replaceAll不会改变它

时间复杂度是O(n^2)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: