331. Verify Preorder Serialization of a Binary Tree ~~~~~
2016-07-07 11:11
141 查看
方法一:
我自己的方法,建一个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)
相关文章推荐
- flume监控
- Android Material Design动画(上)
- Spring内置Quartz的使用
- C++单例模式对比
- 【cqbzoj 1227】字串距离
- moravec、harris、Shi-Tomasi角点检测的简介及OpenCV代码实现
- 不使用库函数,编写函数int strcmp(char *source, char *dest) 相等返回0,不等返回-1;
- java ant编译
- JS闭包学习笔记(1):什么是闭包
- ssl 申请流程
- 在word文档中插入一个字后就会自动删除后一个字的原因及解决办法
- ListView的下拉刷新上拉加载以及带列的横向滚动
- Wamp下的Apache无法启动的解决方法
- 开源:一个简单的日历选择控件
- java数组初始化
- Java线程相关
- Java实现SOAP协议
- 331. Verify Preorder Serialization of a Binary Tree
- WebView简介(加速加载篇)
- androidstudio git项目到github出现的错误解决办法