给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。
注意:两个节点之间的路径长度由它们之间的边数表示。
此题和leetcode124思路完全相同(题解连接https://blog.csdn.net/sakura_is_the_best/article/details/103809207),这个题也是这条路径不能有回路,也就是这条路径最多只有一个节点的两个子树都被包括在内,这句话直接理解比较困难,可以先看看124题,那个里面解释的比较详细。
此题中dfs(root)表示root节点最多只选择一个子树可以得到的最长同值路径,这个相同的值就是root.val,注意只有当前节点的值和左右字树的值相同才能加上dfs(root.left)或者dfs(root.right)。
注意这个题测试数据有空树,所以注意ans的初始化。
class Solution {
int ans;
public int dfs(TreeNode root)
{
if(root==null)
return 0;
int l = dfs(root.left);
if(l>0&&root.val!=root.left.val)
l = 0;
int r = dfs(root.right);
if(r>0&&root.val!=root.right.val)
r = 0;
ans = Math.max(ans,l+r+1);
return Math.max(l,r)+1;
}
public int longestUnivaluePath(TreeNode root) {
ans = 0;
dfs(root);
return Math.max(ans-1,0);
}
}