【二叉树-最长路径系列(任意路径)】直径、最长同值路径、 最大路径和(DFS、树形DP)
总述
- 这类题目都是求一个最长路径,这个路径可以不经过根节点。
- 使用dfs(即递归地遍历树)的方法。维护一个全局最长路径max作为最终结果,而递归方法dfs返回的是含根节点的最长路径。(若不使用全局变量,也可将返回类型构造自定义类,如题目124的代码2)
- 注意题目是求路径(两点之间一条线)与节点数的区别,
- 决定+1之类的细节
- 决定dfs的递归终止是null节点还是叶子结点(若是叶子结点,当到叶子结点,要控制不进入null结点)。
- 另外,求不经过根节点的最长路径一定是全部节点都要遍历,不存在剪枝情况,所以dfs不要放到if语句中。
- 另附树形DP的思想:满足"依次求出每一个节点为根节点的二叉树的子树上的最大距离,那么最终答案一定在其中",所以可以使用树形dp。
详细分析步骤按树形dp步骤来即可,简单。
题目 543. 二叉树的直径
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过根结点。
代码
class Solution {
private int maxLen=0;
public int diameterOfBinaryTree(TreeNode root) {
if(root==null){return 0;}
getTreeHeight(root);
return maxLen;
}
private int getTreeHeight(TreeNode root){
if(root.left==null&&root.right==null){
return 0;
}
int leftHeight=root.left==null?0:getTreeHeight(root.left)+1;
int rightHeight=root.right==null?0:getTreeHeight(root.right)+1;
maxLen=Math.max(maxLen,leftHeight+rightHeight);
return Math.max(leftHeight,rightHeight);
}
}
题目 687. 最长同值路径
给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。
注意:两个节点之间的路径长度由它们之间的边数表示。
题解
增加判断,若左孩子与当前节点值不同,则清左边最大同值路径长度=0;右孩子同理。
代码
class Solution {
private int max = Integer.MIN_VALUE;
public int maxPathSum(TreeNode root) {
maxRootPathSum(root);
return max;
}
private int maxRootPathSum(TreeNode root){
if(root==null){return 0;}
int leftMaxVal=Math.max(0,maxRootPathSum(root.left));
int rightMaxVal=Math.max(0,maxRootPathSum(root.right));
max=Math.max(max,leftMaxVal+rightMaxVal+root.val);
return Math.max(leftMaxVal,rightMaxVal)+root.val;
}
}
题目 124. 二叉树中的最大路径和
给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
题解
与上两题不同,这题是求节点和,所以当和为负,要更新为0;
代码
class Solution {
private int max = Integer.MIN_VALUE;
public int maxPathSum(TreeNode root) {
maxRootPathSum(root);
return max;
}
private int maxRootPathSum(TreeNode root){
if(root==null){return 0;}
int leftMaxVal=Math.max(0,maxRootPathSum(root.left));
int rightMaxVal=Math.max(0,maxRootPathSum(root.right));
max=Math.max(max,leftMaxVal+rightMaxVal+root.val);
return Math.max(leftMaxVal,rightMaxVal)+root.val;
}
}
代码2 返回类型使用构造类,代替类变量
class Type{
int maxDis;
int treeHeight;
public Type(int maxDis,int treeHeight) {
this.maxDis=maxDis;
this.treeHeight=treeHeight;
}
}
public class Main {
public static void main(String args[]) {
//test
Node n1=new Node(1);
Node n2=new Node(2);
Node n3=new Node(3);
Node n4=new Node(4);
Node n5=new Node(5);
n1.left=n2;
n1.right=n3;
n3.left=n4;
n3.right=n5;
int maxDis=maxDistance(n1).maxDis;
System.out.println(maxDis);
}
public static Type maxDistance(Node root) {
if(root==null) {
return new Type(0,0);
}
Type lMes=maxDistance(root.left);
Type rMes=maxDistance(root.right);
int disTemp=lMes.treeHeight+rMes.treeHeight+1;
int maxDis=Math.max(Math.max(lMes.maxDis, rMes.maxDis), disTemp);
int height=Math.max(lMes.treeHeight, rMes.treeHeight)+1;
return new Type(maxDis,height);
}
}
【二叉树-最长路径系列(任意路径)】直径、最长同值路径、 最大路径和(DFS、树形DP)的更多相关文章
- 图论--树的直径--DFS+树形DP模板
#include <iostream> #include <cstring> using namespace std; //maxv:源点能到的最远点,maxdis:最远点对应 ...
- 【树形dp 最长链】bzoj1912: [Apio2010]patrol 巡逻
富有思维性的树形dp Description Input 第一行包含两个整数 n, K(1 ≤ K ≤ 2).接下来 n – 1行,每行两个整数 a, b, 表示村庄a与b之间有一条道路(1 ≤ a, ...
- 【Data Structure & Algorithm】二叉树中和为某值的所有路径
二叉树中和为某值的所有路径 题目:输入一个整数和一个二叉树,从树的根节点开始往下访问一直到叶节点所经过的所有节点形成一条路径.打印出和与输入整数相等的所有路径. 例如输入整数22和如下二叉树: 10 ...
- python3实现在二叉树中找出和为某一值的所有路径
在二叉树中找出和为某一值的所有路径请写一个程序创建一棵二叉树,并按照一定规则,输出二叉树根节点到叶子节点的路径.规则如下:1.从最顶端的根结点,到最下面的叶子节点,计算路径通过的所有节点的和,如果与设 ...
- Leetcode 不同路径系列
Leetcode不同路径系列题解笔记 62. 不同路径 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 "Start" ). 机器人每次只能向下或者向右移动一 ...
- HDU4514 湫湫系列故事——设计风景线 ——树的直径/树形dp+判环
中文题面,给出一个图,问能不能成环,如果可以就输出YES.否则输出该树的直径. 这里的判环我们用路径压缩的并查集就能很快的判断出来,可以在输入的同时进行判断.这题重点就是求树的直径. 树直径的性质可以 ...
- Luogu 2764 最小路径覆盖问题 / Libre 6002 「网络流 24 题」最小路径覆盖 (网络流,最大流)
Luogu 2764 最小路径覆盖问题 / Libre 6002 「网络流 24 题」最小路径覆盖 (网络流,最大流) Description 给定有向图G=(V,E).设P是G的一个简单路(顶点不相 ...
- (转)在二元树中找出和为某一值的所有路径,java版本
摘自:http://www.cnblogs.com/qi09/archive/2011/05/24/2055643.html 4.在二元树中找出和为某一值的所有路径 题目:输入一个整数和一棵二元树. ...
- 4.在二元树中找出和为某一值的所有路径[FindPathsInBinaryTree]
[题目]: 输入一个整数和一棵二元树.从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径.打印出和与输入整数相等的所有路径. 例如输入整数22和如下二元树 10 ...
随机推荐
- ExcelWeb脚本助手,自定义脚本,批量操作Excel与网页
ExcelWeb脚本助手,是一款可以自定义脚本操控Excel和浏览器的工具.提供了简单实用的Excel与Browser的API调用,通过自建脚本或自建项目,随意定制. 可以非常方便的根据Excel中的 ...
- 完了,这个硬件成精了,它竟然绕过了 CPU...
我们之前了解过了 Linux 的进程和线程.Linux 内存管理,那么下面我们就来认识一下 Linux 中的 I/O 管理. Linux 系统和其他 UNIX 系统一样,IO 管理比较直接和简洁.所有 ...
- Java继承后访问成员的特点
继承后的特点--成员变量 对象访问成员变量时,会先在子类中查找有没有定义对应的变量,若子类中存在就会就近使用子类中的变量,若子类中没有定义就会沿着继承关系往上找有没有定义相应的变量,若父类中也没有则编 ...
- JDBC API阐述
JDBC API JDBC API 是一系列的接口,它使得应用程序能够进行数据库联接,执行SQL语句,并且得到返回结果. Driver 接口 Java.sql.Driver 接口是所有 JDBC 驱动 ...
- 宝塔,一个免费好用的 Linux/Windows 服务器管理面板
宝塔面板是什么? 宝塔面板是一款服务器管理软件,支持windows和linux系统,可以通过Web端轻松管理服务器,提升运维效率.例如:创建管理网站.FTP.数据库,拥有可视化文件管理器,可视化软件管 ...
- Less 预处理笔记
1. less 简介 1. less是CSS的预编译器,可以扩展CSS语言(当然也兼容CSS),可以定义变量.混合.函数等等,让CSS代码更易维护和扩展 2. less与传统写法相比: less后缀为 ...
- zstd和zip操作6g的文本
ssd是在固态硬盘上的时间 1.txt 7038308223 bytes 都是默认级别 ======================================== zstd-v1.4.4-w ...
- 【深入理解Java虚拟机】Java虚拟机运行时数据区
Java虚拟机运行时数据区 线程私有 程序计数器 1.当前线程所执行的字节码的行号指示器. 2.唯一不会发生OutOfMemoryError的区域 3.如果执行的是java方法,计数器值为虚拟机字节码 ...
- Android开发之AlertDialog警告提示框删除与取消 详解代码
package cc.jiusansec.www; import android.app.Activity; import android.app.AlertDialog; import androi ...
- 4-6年经验左右、优秀的 Java 程序员应该具备的技能
4-6年经验左右.优秀的 Java 程序员应该具备的技能有哪些,按“专业技能”和“项目”两块,包括但不限于以下内容. 专业节能方面 基础:JDK 常用类的原理.源码.使用场景. 设计模式:常用几种的原 ...