- 最长同值路径
给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。
注意:两个节点之间的路径长度由它们之间的边数表示。
示例 1:
输入:
5
/ \
4 5
/ \ \
1 1 5
输出:
2
示例 2:
输入:
1
/ \
4 5
/ \ \
4 4 5
输出:
2
class Solution {
int ans;
public int longestUnivaluePath(TreeNode root) {
ans = 0;//ans仍然通过在遍历过程,记录最大值的
longgestPath(root);
return ans;
}
int longgestPath(TreeNode root){
//注意要明确函数的功能,寻找以root为出发点的同值最长路径
if(root == null) return 0;
//利用后序遍历,先分析左右两个分值的结果
int left = longgestPath(root.left);//左子树的值
int right = longgestPath(root.right);//右子树的值
//若root不是起点,综合left,right求ans值
if(root.left != null && root.val == root.left.val && root.right != null
&& root.right.val == root.val){
ans = Math.max(ans, left + right + 2);
//+2由于是分析的子节点,加上根节点,则+2
}
int funRes = 0;
//根据left,right的值,实现该函数的功能,求root为起点的值,即函数需要返回的值
if(root.left != null && root.left.val == root.val){
funRes = left + 1;
}
if(root.right != null && root.right.val == root.val){
funRes = Math.max(funRes, right + 1);
}
//再更新一次,因为有可能上面是不满足的,需要重新赋值
ans = Math.max(ans, funRes);
return funRes;
}
}