LeetCode687.最长同值路径问题

LeetCode687.最长同值路径问题

问题描述:

波波老师您好,关于这题计算路径的我对递归方法大致懂了,最后的res用于统计最大的left与right之和我个人理解是,不管这个路径怎么左右动由于只能同值才能增加,所以只需要更新最大的left+right就能获取最大路径,但是我又对返回值有点迷惑,我自己写的是直接return res,但是答案是return left和right最大值,所以对这两行代码产生了疑惑

相关代码:

public class Solution {
/**
* LC.687 求二叉树路径问题 不从根节点开始
*/
private int res;

public int longestUnivaluePath(TreeNode root) {
res = 0;
//判断空根节点问题
if (root == null)
return 0;
longPath(root);
return res;
}

//通过DFS后序遍历实现
private int longPath(TreeNode root) {
//判断递归的结束条件 也就是递归到底
if (root == null) {
return 0;
}

//实现后序遍历 通过left right变量记录当前节点下的左右最长路径分别为多少
int left = longPath(root.left);
int right = longPath(root.right);

//如果当前的根节点不存在左节点与之相等 则无法构成路径 毕竟两个节点构成一个路径
//右节点一个道理
if (root.right != null && root.right.val == root.val) {
right++;
}else{
//如果不存在或者值不一样 无法构成同值路径
//也就是说明这个值的节点右边最长路径到此结束 重新统计
right = 0;
}
if (root.left != null && root.left.val == root.val) {
left++;
}else{
left = 0;
}
//由于只有值相等才能继续往下 所以不管是左右怎么向下遍历 值都是一样的
//res用于记录最终的最大路径值 初始值设置为0因为测试用例都大于零
//如果测试用例有负数 那应该使用最小的整形 res = Integer.MIN_VALUE;
res = Math.max(res, left + right);
return Math.max(left, right);
}
}


正在回答

登陆购买课程后可参与讨论,去登陆

1回答
longestUnivaluePath(TreeNode root)

的语义是,返回以 root 为根节点的和 root 同值的最大长度。这条路径是“不拐弯”的。


所以会有:

int left = longPath(root.left);
int right = longPath(root.right);


也就是看以 root.left 为根节点的最长同值路径和以 root.right 为根节点的最长同值路径。然后,看这两条最长同值路径,可不可能和 root 构成一条更长的同值路径。如果可能,这条路径是可能“拐弯”的。"拐点"是 root。


所以,res 的更新是看 left + right(注意,left 和 right 在之前的逻辑中有一定的更新);而返回的是 max(left, right)。因为 res 和函数的返回值不是一回事儿。


res 是题目所求的;

返回值是以 root 为根节点的和 root 同值的最大长度,我们要根据返回值,计算 res 是否需要更新。


==========


请再次体会:

不管是写程序,还是理解程序,关键是搞清楚程序的语义,即每个变量到底表达什么意思;每个函数到底是做什么事,这一点至关重要。逻辑是围绕这些定义的。


继续加油!:)

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
算法与数据结构
  • 参与学习       2583    人
  • 解答问题       1082    个

慕课网算法名师Liuyubobobo,5年集大成之作 从0到工作5年,算法与数据结构系统解决方案

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师