题干:
给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。
注意:两个节点之间的路径长度由它们之间的边数表示。
示例:
输入:
5
/ \
4 5
/ \ \
1 1 5
输出:2
class Solution {
private int count = 0;
public int longestUnivaluePath(TreeNode root) {
if(root==null) return 0;
dfs(root);
return count;
}
public int dfs(TreeNode root){
if(root==null) return 0;
int left = dfs(root.left);
int right = dfs(root.right);
int leftPath = root.left!=null&&root.left.val==root.val? left+1:0;
int rightPath = root.right!=null&&root.right.val == root.val? right+1:0;
count = Math.max(count,leftPath+rightPath);
return Math.max(leftPath,rightPath);
}
}
思路是经过dfs去修改最大路径长度count。
首先,dfs这个函数的返回值是leftPath和rightPath的较大者,而leftPath和rightPath则是当前节点与左右子树中值相等的结点的边数(如果当前结点与左右子结点相等则在left或right上加1,加的也就是当前结点与左右子树连接的这条边,如果不相等,则为0),而left和right则是指当前结点的左右子树中值相等的最大路径长度。