总述

  • 这类题目都是求一个最长路径,这个路径可以不经过根节点。
  • 使用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)的更多相关文章

  1. 图论--树的直径--DFS+树形DP模板

    #include <iostream> #include <cstring> using namespace std; //maxv:源点能到的最远点,maxdis:最远点对应 ...

  2. 【树形dp 最长链】bzoj1912: [Apio2010]patrol 巡逻

    富有思维性的树形dp Description Input 第一行包含两个整数 n, K(1 ≤ K ≤ 2).接下来 n – 1行,每行两个整数 a, b, 表示村庄a与b之间有一条道路(1 ≤ a, ...

  3. 【Data Structure & Algorithm】二叉树中和为某值的所有路径

    二叉树中和为某值的所有路径 题目:输入一个整数和一个二叉树,从树的根节点开始往下访问一直到叶节点所经过的所有节点形成一条路径.打印出和与输入整数相等的所有路径. 例如输入整数22和如下二叉树: 10 ...

  4. python3实现在二叉树中找出和为某一值的所有路径

    在二叉树中找出和为某一值的所有路径请写一个程序创建一棵二叉树,并按照一定规则,输出二叉树根节点到叶子节点的路径.规则如下:1.从最顶端的根结点,到最下面的叶子节点,计算路径通过的所有节点的和,如果与设 ...

  5. Leetcode 不同路径系列

    Leetcode不同路径系列题解笔记 62. 不同路径 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 "Start" ). 机器人每次只能向下或者向右移动一 ...

  6. HDU4514 湫湫系列故事——设计风景线 ——树的直径/树形dp+判环

    中文题面,给出一个图,问能不能成环,如果可以就输出YES.否则输出该树的直径. 这里的判环我们用路径压缩的并查集就能很快的判断出来,可以在输入的同时进行判断.这题重点就是求树的直径. 树直径的性质可以 ...

  7. Luogu 2764 最小路径覆盖问题 / Libre 6002 「网络流 24 题」最小路径覆盖 (网络流,最大流)

    Luogu 2764 最小路径覆盖问题 / Libre 6002 「网络流 24 题」最小路径覆盖 (网络流,最大流) Description 给定有向图G=(V,E).设P是G的一个简单路(顶点不相 ...

  8. (转)在二元树中找出和为某一值的所有路径,java版本

    摘自:http://www.cnblogs.com/qi09/archive/2011/05/24/2055643.html 4.在二元树中找出和为某一值的所有路径 题目:输入一个整数和一棵二元树.  ...

  9. 4.在二元树中找出和为某一值的所有路径[FindPathsInBinaryTree]

    [题目]: 输入一个整数和一棵二元树.从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径.打印出和与输入整数相等的所有路径. 例如输入整数22和如下二元树 10              ...

随机推荐

  1. nodejs版本DESede/CBC/PKCS5Padding算法封装(3des)

    最近对接了一个第三方支付项目,用的加密算法是根本没听过的:DESede/CBC/PKCS5Padding 这个算法真的是坑爹了,网上搜索了一堆只有java版本是正常的,nodejs版本的各种问题,我了 ...

  2. 什么是P,NP和NPC问题?

    P问题,NP问题,NPC问题?这些都是计算机科学领域,关于算法方面的术语.在认识这些术语之前,建议同学们先认真学习一下算法的时间复杂度,因为算法的时间复杂度与P,NP和NPC问题高度相关. 什么是P问 ...

  3. docker简记

    title: docker学习简记 date: 2019-10-16 15:10:39 tags: docker Docker简记 1:Docker简介 1)出现背景 一款产品从开发到上线,从操作系统 ...

  4. StructuredStreaming(New)

    SparkStreaming API using DataSets and DataFrames  (New) 使用流式DataSets和流式DataFrames的API ◆ 1.创建流式DataFr ...

  5. magento 2 cronjob setup

    crontab -u magento_user -e */5 * * * * php /var/www/html/bin/magento cron:run >> /var/www/html ...

  6. oracle 将数据库的表复制到另一个数据库表内

    将数据库A中的表sys_role复制到数据库B中在数据库b中的SQL工作表写如下代码: 第一步:建立链接 CREATE database link A //数据库名称CONNECT to text  ...

  7. Webstorm的常用快捷键

    编辑 Ctrl + Space 基本代码完成 (任何类. 方法或变量名称) Ctrl + Shift + Enter 完整的语句 Ctrl + P (在方法调用参数) 内的参数信息 Ctrl + Q ...

  8. Java 实例 - 获取本机ip地址及主机名

    package guyu.day0824; import java.net.InetAddress; /** * @Author: Fred * @Date: 2020/8/24 09:39 */ p ...

  9. 开始进行lammps手册的学习啦,跟着Manual一边翻译一边做吧!(转载)

    转载自:http://blog.sina.com.cn/s/blog_64813e370100ngsz.html 注明:黄色部分基本上为不懂的部分,红色字体为所做注释 一.各种文件的介绍: 1 in ...

  10. 【Spring】使用@Profile注解实现开发、测试和生产环境的配置和切换,看完这篇我彻底会了!!

    写在前面 在实际的企业开发环境中,往往都会将环境分为:开发环境.测试环境和生产环境,而每个环境基本上都是互相隔离的,也就是说,开发环境.测试环境和生产环境是互不相通的.在以前的开发过程中,如果开发人员 ...