力扣题目汇总分析 利用树形DP解决问题

devtools/2024/10/20 10:22:03/

里 任意两个节点之间的问题。而不是根节点到叶子节点的问题或者是父节点到子节点的问题。通通一个套路,即利用543的解题思路。

543.二叉的直径

分析

明确:二叉的 直径 是指中任意两个节点之间最长路径的 长度。两个节点之间的最长路径是他们之间的边数。
任意两个节点之间的路径,这个路必然会在一个根节点拐弯(拐弯之后可能继续往下,也可能不继续往下)
所以我们可以遍历每个节点,求出在这个节点拐弯的最长路径,显然,某节点处拐弯的最长路径=左子的深度+右子的深度(根节点深度为1)。
利用dfs遍历节点,递归得到子的深度,原问题与子问题的关系是:子的深度=max(左子的深度,右子的深度)+1。递归终止条件是,当前要遍历的节点是空节点,则返回深度为0。在递归函数中,得到左右子的深度后,即可以求出当前节点处拐弯的最长路径,定义一个全局变量mm存最长路径,比较当前节点处拐弯的最长路径和全局变量,看看是否要替换。
所以在dfs遍历二叉的基础上,返回值是当前的深度,在递归函数体中取得左右子的深度,算出当前节点处拐弯的最长路径与全局变量mm进行比较。

代码实现
class Solution {int maxDiameter=0;public int diameterOfBinaryTree(TreeNode root) {dfs(root);return maxDiameter;}public int dfs(TreeNode root){if (root==null) return 0;//在当前拐弯的最长直径路径=左子深度+右子深度int l=dfs(root.left);int r=dfs(root.right);maxDiameter=l+r>maxDiameter?l+r:maxDiameter;return l>r?l+1:r+1;}
}

class Solution {int maxDiameter=0;public int diameterOfBinaryTree(TreeNode root) {dfs(root);return maxDiameter;}public int dfs(TreeNode root){if (root==null) return -1;//在当前拐弯的最长直径路径=左子最长链长度+1+右子最长链长度+1int l=dfs(root.left)+1;int r=dfs(root.right)+1;maxDiameter=l+r>maxDiameter?l+r:maxDiameter;return l>r?l:r;}
}

687.最长同值路径

分析

这题也是求任意两个节点之间的最长路径,但是加了个条件,路径上的每个节点的值一样。
本来,当前节点处拐弯的最长路径=左子最长同值路径长度+1+右子最长同值路径长度+1。
但是,如果左节点的值和当前节点的值不一样,就不考虑左子(也就相当于让 左子最长同值路径长度=0),右节点同样操作。

代码实现
class Solution {int mm=0;public int longestUnivaluePath(TreeNode root) {dfs(root);return mm;}public int dfs(TreeNode root){if (root==null) return -1;int l=dfs(root.left)+1;if (root.left!=null && root.left.val!=root.val){l=0;}int r=dfs(root.right)+1;if (root.right!=null && root.right.val!=root.val){r=0;}mm=l+r>mm?l+r:mm;return l>r?l:r;}
}

124.二叉中的最大路径和

分析

找一条节点序列,序列里每个节点值之和最大。序列里至少有一个节点,序列的起始节点任意。
问题本质和前面的两个题都一样。只是这次找最大的路径上的节点值之和。
当前节点处拐弯的路径上节点之和的最大值=左子最大路径之和+右子最大路径之和+当前节点值。
和找同值路径类似,本题中,如果左子的最大路径之和带来的是负增益,就不考虑(也就是让 左子最大路径之和=0)。右子同样操作。

代码实现
class Solution {int mm=-2147483648;public int maxPathSum(TreeNode root) {dfs(root);return mm;}public int dfs(TreeNode root){if (root==null) return 0;int l=dfs(root.left);l=l>0?l:0;int r=dfs(root.right);r=r>0?r:0;mm=l+r+root.val>mm?l+r+root.val:mm;return l>r?l+root.val:r+root.val;}
}

2246.相邻字符不同的最长路径

分析

这题要求找一条最长路径,这个路径上任意一对相邻节点都没有分配到相同字符(最长相邻不同值路径),与前面有所不同的是,这题针对一般的,而不是二叉

所以我们需要取出当前节点的子节点列表,循环遍历,递归处理每个子节点,递归完一个子节点后,如果这个子节点的值和当前节点的值相同,则不考虑(即不参与更新maxNum,mm的操作,当然也可以把值置为0,但是置为0后参与了后续比较操作,属于多余操作)。

当前节点处拐弯的最长不同值路径=子节点中的最大不同值路径长度+1+子节点中不同值路径长度第二大的值+1。

定义一个变量maxNum,存已经遍历的子节点里最大的不同值路径长度,定义一个变量mm,当前节点处拐弯的最长不同值路径的长度,mm每次与 新遍历子节点的最大的不同值路径长度+maxNum进行比较,看看是否替换。如果不可以替换,说明次大的值还是在已经遍历的节点中出现。(通过这种方式,无需创建一个列表存每个子节点的最大不同值路径长度)

代码实现
class Solution {int mm=0;Map<Integer,List<Integer>> map=new HashMap<>();String ss;public int longestPath(int[] parent, String s) {ss=s;for (int i=0;i<parent.length;i++){List<Integer> l=map.getOrDefault(parent[i],new ArrayList<Integer>());l.add(i);map.put(parent[i],l);}dfs(0);return mm+1;}public int dfs(int i){int maxNum=0;if (!map.containsKey(i)){return 0;}for (int c:map.get(i)){int num = dfs(c)+1;if (ss.charAt(c)!=ss.charAt(i)){mm = maxNum+num>mm?maxNum+num:mm;maxNum = num>maxNum?num:maxNum;}}return maxNum;}
}

http://www.ppmy.cn/devtools/40154.html

相关文章

PPMP_char3

PMPP char3 – Multidimensional grids and data ​ 五一过后&#xff0c;有些工作要赶&#xff0c;抽出时间更新一下。这一章基本都熟练掌握&#xff0c;在做习题过程中有一些思考。这里涉及到了一点点GEMM&#xff08;矩阵乘&#xff09;&#xff0c;GEMM有太多可深挖的了&a…

Postman工具介绍与安装

一、Postman介绍 Postman 乃是一款对 HTTP 协议予以支持的接口调试及测试工具&#xff0c;其突出特性在于功能强大&#xff0c;并且使用简便、易用性良好。不管是开发人员开展接口调试工作&#xff0c;还是测试人员进行接口测试任务&#xff0c;Postman 均属于首选工具之一。 接…

WebRTC实现多人通话-Mesh架构【保姆级源码教程】

一、Mesh架构 WebRTC&#xff08;Web Real-Time Communications&#xff09;中的Mesh架构是一种将多个终端之间两两进行连接&#xff0c;形成网状结构的通信模式。以下是关于WebRTC的Mesh架构的详细解释&#xff1a; 基本概念&#xff1a;在Mesh架构中&#xff0c;每个参与者…

webpack配置、插件使用案例

概念 本质上&#xff0c;webpack 是一个用于现代 JavaScript 应用程序的 静态模块打包工具。当 webpack 处理应用程序时&#xff0c;它会在内部从一个或多个入口点构建一个 依赖图(dependency graph)&#xff0c;然后将你项目中所需的每一个模块组合成一个或多个 bundles&…

【Unity Animation 2D】Unity Animation 2D骨骼绑定与动画制作

一、图片格式为png格式&#xff0c;并且角色各部分分离 图片参数设置 需要将Sprite Mode设置为Single&#xff0c;否则图片不能作为一个整体 1、创建骨骼 1.1 旋转Create Bone&#xff0c;点击鼠标左键确定骨骼位置&#xff0c;移动鼠标再次点击鼠标左键确定骨骼&#xff0c…

界面组件Kendo UI for Angular教程 - 构建强大的PDF阅读器(一)

如今当用户需要处理PDF文件时&#xff0c;通常不得不下载应用程序或者浏览器插件&#xff0c;控制用户如何与PDF交互并不是一件容易的事。如果我们提供PDF作为内容&#xff0c;用户可以下载它并使用浏览器或PDF本身提供的控件进行交互。然而&#xff0c;一些企业可能希望控制用…

在IDEA中如何用Kafka进行异步处理

在IDEA的项目中使用Kafka进行异步处理 在项目的pom.xml文件中&#xff0c;添加以下依赖&#xff1a; <dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>2.5.0</version> </dep…

计算机网络实验1:交换机基本配置管理

实验目的和要求 安装Packer Tracer&#xff0c;了解Packer Tracer的基本操作掌握交换机基本命令集实验项目内容 认识Packet Tracer软件 交换机的基本配置与管理 交换机的端口配置与管理 交换机的端口聚合配置 交换机划分Vlan配置 实验环境 硬件&#xff1a;PC机&#x…