题目:最长同值路径
给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。
注意:两个节点之间的路径长度由它们之间的边数表示。
示例 1:
输入:
5
/ \
4 5
/ \ \
1 1 5
输出:2
示例 2:
输入:
1
/ \
4 5
/ \ \
4 4 5
输出:2
解
本题的最长路径可以分两种情况:
第一种,是从直线到叶子节点,如示例1;
第二种,是带拐点,如示例2;
求解时,我通过计数连续的相同结点个数,然后返回结点个数-1即最长路径。
思路如下:
- 设置一个全局变量L,存储最大结点个数
- 递归处理每个结点,并将本结点的值传给下一个处理的结点,分别获取左子树、右子树和本结点相同的的结点个数LL、LR
- 求出路径长度,并和L比较取较大值。
这里无论是第一种还是第二种情况,此时的最长路径长度均是:左子树个数LL + 右子树个数LR + 1 - 返回相同结点个数的值
如果本结点和上一结点传入值相同,则返回max(LL,LR)+1;
如果本结点和上一结点传入值不同,则返回0;
class Solution {
int L = 0;
public:
int longestUnivaluePath(TreeNode* root) {
if(root == NULL) return 0;
getLongest(root,root->val);
return L-1;
}
int getLongest(TreeNode* root , int nVal)
{
//异常处理
if(root == NULL) return 0;
//左子树结点个数
int LL = getLongest(root->left,root->val);
//右子树结点个数
int LR = getLongest(root->right,root->val);
//获取最多的结点个数
int length = LL+LR+1;
//比较,获最大值
L= max(length , L);
//值相同
if(root->val == nVal)
//返回左右子树结点树较大值+1(本结点)
return max(LL,LR)+1;
else
//否则返回0;
return 0;
}
};