331. Verify Preorder Serialization of a Binary Tree
2016-07-07 11:10
417 查看
方法一:
我自己的方法,建一个stack,每遇到数字就推进栈里,每遇到#,就弹出一个数字,最后栈里必须剩一个#。
时间复杂度是O(n)
2. 别人的方法
每一个数字可以有两条发出的边,每个#会占用一条边,每一个数字自己本身会占用一个边,但是又会产生两个边,所以维持一个计数,一旦小于0就返回false。
注意的是:
1)这个数字初始化是1,相当于,一个根节点自己用掉1条是-1,又产生俩,所以加起来是1;
2)每遇到数字的时候,要把-1和+2分开做,如果-1的时候就小于0了,就返回false
时间复杂度是O(n)
方法三:
非常好看的方法,每一个叶节点的结构是“数字,#,#”,所以我们把所有的这样的格式都替换成一个“#”,不断地收缩,直到缩到最后应该是一个#。
第三行,之所以有“!after.equals(preorder)”,是因为比如一个不合法的树“1,2,3”,并没有“数字,#,#”这样的结构,所以replaceAll不会改变它
时间复杂度是O(n^2)
我自己的方法,建一个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)
相关文章推荐
- WebView简介(加速加载篇)
- androidstudio git项目到github出现的错误解决办法
- *.jar 与 *.aar 的生成与*.aar导入项目方法
- git管理项目疑难
- A. Opponents
- ios .h声明变量在@interface括号里和外面
- 通过Intellij IDEA对tomcat进行远程调试
- Linux快速修改用户密码
- 怎么实现ZBrush 中的映射大师功能的灵活运用
- docker镜像相关命令
- 虚拟主机.htaccess设置
- Redis - HyperLogLogs
- 职场困惑——搞大数据的人,还该不该学习代码?
- WriteOutputStream
- BootStrap Table 重写API实现 可对列选择性的搜索
- 程序员的迷茫期
- 职场困惑——还该不该学习代码?
- 7月29日来到!微软推广Win10开启疯狂模式
- RecyclerView刷新
- 23种设计模块