687. 最长同值路径(Leetcode)(递归+树)
687. 最长同值路径
题目链接:
https://leetcode-cn.com/problems/longest-univalue-path/
题解:
这个题真的绝了,先谈思路:
1)找到node结点的左右子树的最长单向延升的路径长度
2)在找最长单向延生的路径的过程中,记录以当前结点为根的最长同值路径(这个是附属品,切不可返回改值,返回改值,会导致返回连通路径的长度,而不是一条不用拐弯的路径)
坑点:
必须先找左右子树的最长单向延升的路径长度,虽然这个左右子树的最长单向延升的路径长度只会在if里的时候用,但是必须在if外面就求出来,如果这样做,当if语句条件不满足时,就没法循环遍历所有结点了。
AC代码:
class Solution {
int ans = 0;
public int longestUnivaluePath(TreeNode root) {
arrowLength(root);
return ans;
}
public int arrowLength(TreeNode root) {
if(root == null) return 0;
if(root.left == null && root.right == null) return 0;
// 必须把leftAns和rightAns写在外面,虽然只会在if语句里用,但是为了构建结果ans,必须写外面,如果不写外面,左右子树的ans可能没构建
int leftAns = arrowLength(root.left);
int rightAns = arrowLength(root.right);
int ans1 = 0, ans2 = 0;
// 以下为一开始的错误示范
// if(root.left != null && root.left.val == root.val) ans1 = 1 + arrowLength(root.left);
// if(root.right != null && root.right.val == root.val) ans2 = 1 + arrowLength(root.right);
if(root.left != null && root.left.val == root.val) ans1 = 1 + leftAns;
if(root.right != null && root.right.val == root.val) ans2 = 1 + rightAns;
ans = Math.max(ans,ans1 + ans2);
return Math.max(ans1,ans2);
}
}