<Tree> 298 250 366 199(高频) 98(高频)
298. Binary Tree Longest Consecutive Sequence
先序遍历,根左右。如果该节点的 value == 父节点value + 1, 则长度+1; 否则重置为1。
class Solution {
private int res = 0;
public int longestConsecutive(TreeNode root) {
if(root == null) return 0;
dfs(root, root.val, 0);
return res;
}
private void dfs(TreeNode root, int v, int out){
if(root == null) return;
if(root.val == v + 1){
out++;
}else{
out = 1;
}
res = Math.max(res, out);
dfs(root.left, root.val, out);
dfs(root.right, root.val, out);
}
}
250. Count Univalue Subtrees
后序遍历,左右根。
如果节点为叶子节点则 count++,并验证该节点是否与父节点的值相同,是则为true。如果节点和左右子树返回值都是true,则count++。
1.叶节点也都相同,count++。
2.对于当前遍历到的节点,如果对其左右子节点分别递归调用函数,返回均为true的话,那么说明当前节点的值和左右子树的值都相同,那么又多了一棵树,所以结果自增1
class Solution {
private int count;
public int countUnivalSubtrees(TreeNode root) {
count = 0;
helper(root, Integer.MAX_VALUE);
return count;
}
private boolean helper(TreeNode root, int v){
if(root == null) return true;
boolean left = helper(root.left, root.val);
boolean right = helper(root.right, root.val);
if(left && right){
count++;
return root.val == v;
}
return false;
}
}
366. Find Leaves of Binary Tree
一层一层剥离当前树的所有叶子节点。叶子节点高度设为0,所以 res.size( )的大小 == 当前层数 + 1。
每一个节点从左子节点和右子节点分开走可以得到两个深度,由于成为叶节点的条件是左右子节点都为空,所以我们取左右子节点中较大值加1为当前节点的深度值,知道了深度值就可以将节点值加入到结果res中的正确位置了。加入root.val时要remove该叶子节点 root = null。
class Solution {
public List<List<Integer>> findLeaves(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
height(root, res);
return res;
}
private int height(TreeNode root, List<List<Integer>> res){
if(root == null) return -1;
int level = Math.max(height(root.left, res), height(root.right, res)) + 1;
if(res.size() < level + 1){
res.add(new ArrayList<>());
}
res.get(level).add(root.val);
root = null;
return level;
}
}
199. Binary Tree Right Side View
求每一层最右边的节点
先序遍历中序遍历后序遍历都可,只要保证右侧节点的添加在左侧添加之后。
每当开始新一层节点的遍历之前,先把新一层最后一个节点值存到结果中
class Solution {
public List<Integer> rightSideView(TreeNode root) {
List<Integer> res = new ArrayList<>();
HashMap<Integer, Integer> map = new HashMap<>();
int depth = 1;
dfs(root, depth, map);
//map --> List<Integer> list
depth = 1;
while(map.containsKey(depth)){
res.add(map.get(depth));
depth++;
}
return res;
}
private void dfs(TreeNode root, int depth, Map<Integer, Integer> map){
//Exit
if(root == null) return;
//traverse
map.put(depth, root.val); // do not have to be preorder
dfs(root.left, depth + 1, map);
dfs(root.right, depth + 1, map);
}
}
98. Validate Binary Search Tree
测试用例中可能有超过Integer.MAX_VALUE的值。故用Long.MAX_VALUE
class Solution {
public boolean isValidBST(TreeNode root) {
if(root == null) return true;
return valid(root, Long.MIN_VALUE, Long.MAX_VALUE);
}
private boolean valid(TreeNode root, long low, long high){
if(root == null) return true;
if(root.val <= low || root.val >= high) return false;
return valid(root.left, low, Math.min(root.val, high)) && valid(root.right, Math.max(low, root.val), high);
}
}
<Tree> 298 250 366 199(高频) 98(高频)的更多相关文章
- 用 R 进行高频金融数据分析简介
作者:李洪成 摘自:http://cos.name/wp-content/uploads/2013/11/ChinaR2013SH_Nov03_04_LiHongcheng.pdf 高频数据 金融市场 ...
- 高频交易[z]
著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:袁浩瀚链接:https://www.zhihu.com/question/21789812/answer/22178178来源 ...
- Java才是世界上最好的语言,Java在高频交易中替代C++
高频交易 高频交易是指从那些人们无法利用的极为短暂的市场变化中寻求获利的计算机化交易,比如,某种证券买入价和卖出价差价的微小变化,或者某只股票在不同交易所之间的微小价差.在高频交易中,自动化应用程序每 ...
- Leetcode重点 250题-前400 题
删除不常考,面试低频出现题目 删除重复代码题目(例:链表反转206题,代码在234题出现过) 删除过于简单题目(例:100题:Same Tree) 删除题意不同,代码基本相同题目(例:136 & ...
- LeetCode All in One题解汇总(持续更新中...)
突然很想刷刷题,LeetCode是一个不错的选择,忽略了输入输出,更好的突出了算法,省去了不少时间. dalao们发现了任何错误,或是代码无法通过,或是有更好的解法,或是有任何疑问和建议的话,可以在对 ...
- Fast Matrix Operations(UVA)11992
UVA 11992 - Fast Matrix Operations 给定一个r*c(r<=20,r*c<=1e6)的矩阵,其元素都是0,现在对其子矩阵进行操作. 1 x1 y1 x2 y ...
- poj 1018 Communication System
点击打开链接 Communication System Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 21007 Acc ...
- SVG:中国地图
中国地图 <svg height="578" version="1.1" width="718" xmlns="http:/ ...
- AWR Report 关键参数详细分析
WORKLOAD REPOSITORY report for DB Name DB Id Instance Inst num Startup Time Release RAC CALLDB 12510 ...
随机推荐
- Java之Scanner类
Scanner类概述 一个可以解析基本类型和字符串的简单文本扫描器.简而言之,Scanner类的功能:可以实现键盘输入数据,到程序当中. 例如,以下代码使用户能够从 System.in 中读取一个数. ...
- seq参数 RANDOM 参数 openssl参数 cut参数
#seq命令用于以指定增量从首数开始打印数字到尾数 语法: [2] seq [选项] 首数 尾数 [3] seq [选项] 首数 增量 尾数选项: seq 实例 一 存入数据库 然后 输出数据库的代码 ...
- 【python爬虫】正则表达式
一.数据的分类 1.结构化数据 特点:数据以行为单位,每一个数据表示一个实体.每一行数据的属性都是一样的. 举例:关系型数据库中的表就是结构化数据. 处理方法:sql 2.半结构化数据 特点:结构化数 ...
- Python:程序练习题(二)
Python:程序练习题(二) 2.1温度转换程序. 代码如下: t=input("请输入带符号的温度值(如:32C):") if t[-1] in ["C", ...
- 时间time()和$_SERVER['REQUEST_TIME']
文件ab1.php <?phpforeach($i=0;$i<1000;$i++){ echo $time();} 结果: 文件ab2.php <?php foreach($i=0; ...
- ImportError: unable to find Qt5Core.dll on PATH
一.实验环境 1.Windows7x32_SP1 2.python3.7.4 3.pyinstaller3.5 二.问题描述 1.一直都是在Windows10x64上使用pyinstaller打包ex ...
- 源码学习之Spring (系统架构简单解析)
Spring Framework 系统架构总览图 Spring Framework的模块依赖关系图 Spring Framework各个模块功能说明 Spring核心模块 模块名称 主要功能 Spri ...
- LeetCode 217:存在重复元素 Contains Duplicate
题目: 给定一个整数数组,判断是否存在重复元素. Given an array of integers, find if the array contains any duplicates. 如果任何 ...
- IT兄弟连 HTML5教程 HTML5的学习线路图 第一阶段学习网页制作
学习HTML5技术可并不是简单学会几个新增的标签而已,HTML5现在可以说是前端所有技术的代名词.需要学习的语言和工具不仅多,对于刚接触他们的新人会感觉很乱.另外,前端开发也会细分很多个开发岗位,不同 ...
- javascript在数组的循环中删除元素
在开发JavaScript应用的过程中,经常会遇到在循环中移除指定元素的需求. 按照常规的思路,就是对数组进行一个for循环,然后在循环里面进行if判断,在判断中删除掉指定元素即可. 但是实际情况往往 ...