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);
}
}
13
收起
正在回答
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 星