给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。
注意:两个节点之间的路径长度由它们之间的边数表示。
示例 1:
输入:
5
/ \
4 5
/ \ \
1 1 5
输出:2
示例 2:输入:
1
/ \
4 5
/ \ \
4 4 5
输出:2
解题思路:需要注意的是,这个路径包括从当前节点的左子树经过当前节点到右子树的路径。那么就可以继续采用递归的方法,分为三种情况,若当前遍历的节点为null,返回0;递归计算当前节点两个孩子节点的最长路径,若当前节点与左孩子节点相同,返回左子树最长路径加一,否则返回0,右子树同理。最后一种情况,返回左右子树中较大的路径,比较当前最长路径与新路径,更新最长路径。
class Solution {
int sum = 0;
public int longestUnivaluePath(TreeNode root) {
dfs(root);
return sum;
}
private int dfs(TreeNode root){
int leftSum = 0,rightSum = 0;
if(root == null){
return 0;
}
leftSum = dfs(root.left);
rightSum = dfs(root.right);
leftSum = root.left != null && root.left.val == root.val ? leftSum+1 : 0;
rightSum = root.right != null && root.right.val == root.val ? rightSum+1 : 0;
sum = Math.max(sum,leftSum+rightSum);
return Math.max(leftSum,rightSum);
}
}