给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。
注意:两个节点之间的路径长度由它们之间的边数表示。
5
/ \
4 5
/ \ \
1 1 5
输出为2
1
/ \
4 5
/ \ \
4 4 5
输出为3
题目分析:
根据题目我们可以清晰的分析出每个节点有三种情况
例如 节点 root
情况1:左孩子的值和右孩子的值与root的值相同。
情况2:左孩子的值与root的值不相同,但右孩子的值与root的值相同。
情况3:右孩子的值与root的值不相同,但左孩子的值与root的值相同。
情况4:左孩子的值和右孩子的值与root的值都不相同。
针对每个种情况我们再分析对应的结果:
情况1:root的路径=左孩子的路径+右孩子的路径+2
情况2:root的路径 = 左孩子的路径+1
情况3:root的路径 = 右孩子的路径+1
情况4:root的路径 = 0;
返回结果:左孩子的路径和右孩子的路径之间最大的那个。
设置全局变量ans记录最大路径,采用递归的方式以后序遍历的流程对每个节点进行计算。
代码如下:
Definition for a binary tree node.
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
class Solution {
int ans;
public int longestUnivaluePath(TreeNode root) {
ans =0;
runGetMax(root);
return ans;
}
public int runGetMax(TreeNode root){
if(root==null) {
return 0;
}
int max =0;
int left =runGetMax(root.left);
int right = runGetMax(root.right);
//第一种情况
if(root.left!=null &&root.left.val == root.val && root.right!=null &&root.right.val == root.val){
ans = Math.max(ans ,right+left+2);
}
//第二种情况
if(root.left!=null &&root.left.val == root.val){
max = left+1;
}
//第三种情况
if(root.right!=null &&root.right.val == root.val){
max = Math.max(max , right+1);
}
ans = Math.max(ans ,max);
return max;
}
}