直径问题 Diameter Problems
2019-11-03 21:37:59
一、Diameter of Binary Tree
问题描述:

问题求解:
解法一、第一反应是树上动归,每个节点保存一下左右的最大深度,最后以每个节点作为中枢计算最大的长度即可。
public int diameterOfBinaryTree(TreeNode root) {
Map<TreeNode, int[]> map = new HashMap<>();
dfs(root, map);
int res = 0;
for (TreeNode key : map.keySet()) {
res = Math.max(res, map.get(key)[0] + map.get(key)[1]);
}
return res;
}
private int[] dfs(TreeNode root, Map<TreeNode, int[]> map) {
if (root == null) return new int[]{-1, -1};
int[] l = dfs(root.left, map);
int[] r = dfs(root.right, map);
map.put(root, new int[]{Math.max(l[0], l[1]) + 1, Math.max(r[0], r[1]) + 1});
return map.get(root);
}
解法二、不求直径,而是转求每个节点的最大深度,遍历的时候可以顺便得到直径。
public int diameterOfBinaryTree(TreeNode root) {
int[] res = new int[1];
helper(root, res);
return res[0];
}
private int helper(TreeNode root, int[] res) {
if (root == null) return 0;
int l = helper(root.left, res);
int r = helper(root.right, res);
res[0] = Math.max(res[0], l + r);
return Math.max(l, r) + 1;
}
二、Tree Diameter
问题描述:

问题求解:
int res = 0;
public int treeDiameter(int[][] edges) {
Map<Integer, Set<Integer>> graph = new HashMap<>();
for (int[] edge : edges) {
int u = edge[0];
int v = edge[1];
if (!graph.containsKey(u)) graph.put(u, new HashSet<>());
if (!graph.containsKey(v)) graph.put(v, new HashSet<>());
graph.get(u).add(v);
graph.get(v).add(u);
}
helper(graph, 0, new HashSet<Integer>());
return res;
} private int helper(Map<Integer, Set<Integer>> graph, int node, Set<Integer> used) {
Integer first = null;
Integer second = null;
used.add(node);
for (int next : graph.get(node)) {
if (used.contains(next)) continue;
int tmp = helper(graph, next, used);
if (first == null || first < tmp) {
second = first;
first = tmp;
} else if (second == null || second < tmp) second = tmp;
}
int l1 = first == null ? 0 : first + 1;
int l2 = second == null ? 0 : second + 1;
res = Math.max(res, l1 + l2);
return l1;
}
直径问题 Diameter Problems的更多相关文章
- python 面向对象和类成员和异常处理
python 面向对象 你把自己想象成一个上帝,你要创造一个星球,首先你要把它揉成一个个球,两个直径就能创造一个球 class star: '''名字(name),赤道直径(equatorial di ...
- HDU 1007 Quoit Design
传送门 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Problem Des ...
- P1912: [Apio2010]patrol 巡逻
这道题讨论了好久,一直想不明白,如果按传统的随便某一个点出发找最长链,再回头,K=2 的时候赋了-1就没法用这种方法找最长链了,于是乎,更强的找最长链的方法就来了..类似于DP的东西吧.先上代码: ; ...
- Gym 101606B - Breaking Biscuits - [凸包+旋转卡壳][凸包的宽度]
题目链接:https://codeforces.com/gym/101606/problem/B 题解: 对于给出的 $n$ 个点,先求这些点的凸包,然后用旋转卡壳求出凸包的宽度(Width (min ...
- STP RSTP
一.透明网桥 1.对于一般的透明网桥来说,通常都具有以下的特点: +拓展LAN的能力 +自主动态学习站点的地址信息 当网桥的某个端口上收到含有某个源MAC地址的数据帧时,它就把该MAC地址和接收该数据 ...
- tshark----wireshark的命令行工具
tshark - 转储和分析网络流 概要 tshark的 [ -2 ] [ -a <捕捉自动停止条件>] ... [ -b <捕捉环形缓冲区选项>] ... [ ...
- FOI冬令营 Day2
目录 T1.直径(diameter) 传送门 Code T2.定价(price) 传送门 Code T3.排序(sort) 传送门 Code T1.直径(diameter) 传送门 Code //20 ...
- 【MOOC课程学习记录】数据结构
看了中国大学MOOC zju的<数据结构>2019夏的第九次开课.做了一些PTA上的习题,没有全做,因为做得慢,老是不会,加上并不能做到一有空就学习,所以做不完了,给跪了Orz. 以后有时 ...
- 每天进步一点点------Altium Designer Rules规则详解
对于PCB的设计, AD提供了详尽的10种不同的设计规则,这些设计规则则包括导线放置.导线布线方法.元件放置.布线规则.元件移动和信号完整性等规则.根据这些规则, Protel DXP进行自动布局和自 ...
随机推荐
- 利用Nginx或koa
最近在做上传的图片的需求,思考上传之后的图片怎么访问的问题,因为后端是Node,一开始尝试写一个专门的接口通过传入图片的path来查找,试了一下感觉并不理想,因为要为每种类型的文件设置Content- ...
- Java GUI记账本(基于Mysql&&文件存储两种版本)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.java * 作者:常轩 * 微信公众号:Worldh ...
- React之mockjs+sass+生命周期函数
mdn W3C标准网站 运行sass cnpm i -D node-sass-chokidar npm-run-all rem单位设置 <script> //rem单位设置 documen ...
- 8.【Spring Cloud Alibaba】配置管理-Nacos
使用Nacos管理配置 架构图 配置文件遵循的格式 bootstrap.yml pom.xml <dependency> <groupId>org.springframewor ...
- PDF 相关操作
去年一年偷了下懒, 博客写了一点就没写了, 还好一些大的flag完成了. 花了半年的空余时间, 培养了一门兴趣爱好. 自己在为人处世上还是不够圆滑啊, 也难怪. 自己当初选择走技术这条路的初 ...
- 一些常用的 CSS 技巧和知识点
作为一名前端工程师,CSS 是必备技能之一,然而在日常开发中,总有那么些时候,面对着炫酷的效果图,脑子里的 CSS 属性却一片空白,于是只能借助搜索引擎,在一堆复杂的介绍中找到需要的内容复制粘贴.有没 ...
- PHPRAP v1.0.6 发布,修复因php7.1版本遗弃mcrypt扩展造成安装失败的BUG
PHPRAP,是一个PHP轻量级开源API接口文档管理系统,致力于减少前后端沟通成本,提高团队协作开发效率,打造PHP版的RAP. 更新记录 [修复]修复因php7.1版本遗弃mcrypt扩展造成安装 ...
- JS基础入门篇(二十)—事件对象以及案例(二)
案例一.点击按钮,选中input中的全部内容 select()方法:选中全部. 点击按钮选中输入框中的内容!!!! <!DOCTYPE html> <html lang=" ...
- 学h5前端开发前必知的三大流行趋势
学h5前端开发前必知的三大流行趋势 随着互联网时代的飞速发展,各种互联网的Web应用程序层出不穷,很多人对于HTML5前端开发的过程充满了好奇,但是却没有了解到前端开发的未来发展趋势.下面,云慧学院专 ...
- 一个轻量级的基于 .NET Core 的 ORM 框架 HSQL
HSQL 是一种轻量级的基于 .NET Core 的数据库对象关系映射「ORM」框架 HSQL 是一种可以使用非常简单且高效的方式进行数据库操作的一种框架,通过简单的语法,使数据库操作不再成为难事.目 ...