【二叉树-最长路径系列(任意路径)】直径、最长同值路径、 最大路径和(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 ...
随机推荐
- 没有Qt Quick UI,没有 Qt Quick Project
书上写的是File ‣ New File or Project ‣ Qt Quick Project ‣ Qt Quick UI 但实际上是File ‣ New File or Project ‣ O ...
- Spring事务专题(五)聊聊Spring事务到底是如何实现的
前言 本专题大纲: 本文为本专题倒数第二篇文章. 在上篇文章中我们一起学习了Spring中的事务抽象机制以及动手模拟了一下Spring中的事务管理机制,那么本文我们就通过源码来分析一下Spring中的 ...
- FCIS:Fully Convolutional Instance-aware Semantic Segmentation
论文:Fully Convolutional Instance-aware Semantic Segmentation 目录 0.简介 1.Position-sensitive Score Map ...
- 手把手教你使用VUE+SpringMVC+Spring+Mybatis+Maven构建属于你自己的电商系统之vue后台前端框架搭建——猿实战01
猿实战是一个原创系列文章,通过实战的方式,采用前后端分离的技术结合SpringMVC Spring Mybatis,手把手教你撸一个完整的电商系统,跟着教程走下来,变身猿人找到工作不是 ...
- Jmeter系列(55)- 详解 Throughput Controller 吞吐量控制器
如果你想从头学习Jmeter,可以看看这个系列的文章哦 https://www.cnblogs.com/poloyy/category/1746599.html 简单介绍 自行调整该控制器下的子项的执 ...
- IDEA_Shelve代码搁置与恢复
日常开发中,经常会遇到在当前分支开发到一半,但是需要Checkout上个版本解决bug或调查问题的情况.这个时候,我们是将代码提到Push远程?还是直接Rollback? 最理想的做法,就是将当前的开 ...
- Sqlalchemy 事件监听与初始化
sqlalchemy不仅仅能自动创建数据库,更提供了其他更强大的功能,今天要介绍的就是sqlalchemy中的事件监听,并将其应用到数据库的初始化中. 需求:当插入设置password字段时,自动加密 ...
- 四则运算(C语言实现)
四则运算(c语言实现) 合伙人:魏甫——3118004973 ,温钦益——3118004975 https://github.com/iamdate/work/tree/master 一.项目及其要 ...
- Inherent Adversarial Robustness of Deep Spiking Neural Networks: Effects of Discrete Input Encoding and Non-Linear Activations
郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! arXiv:2003.10399v2 [cs.CV] 23 Jul 2020 ECCV 2020 1 https://github.com ...
- 科普,想成为厉害的 Java 后端程序员,你需要懂这 13 个知识点
老读者就请肆无忌惮地点赞吧,微信搜索[沉默王二]关注这个在九朝古都洛阳苟且偷生的程序员.本文 GitHub github.com/itwanger 已收录,里面还有我精心为你准备的一线大厂面试题. 站 ...