class Solution
{
public:
int res = 0;
int dfs(TreeNode* cur)
{
if(cur == nullptr)
{
return 0;
}
int leftNode = dfs(cur->left);//以 root的左子节点 为起点 的最长同值路径长度
int rightNode = dfs(cur->right); //以 root的右子节点 为起点 的最长同值路径长度
if(cur->left != nullptr && cur->val == cur->left->val) // leftNode表示,以root节点为起点 向左节点延伸 的最长同值路径长度
{ // 如果root->left->val != root->val 那么一个点路径长是0
++leftNode;
}
else
{
leftNode = 0;
}
if(cur->right != nullptr && cur->val == cur->right->val)// rightNode表示,以root节点为起点 向右节点延伸 的最长同值路径长度
{
++rightNode;
}
else
{
rightNode = 0;
}
res = max(res, leftNode + rightNode); // leftNode + rightNode就表示在以root为根节点的树上,经过root节点的最长同值路径的长度
return max(leftNode, rightNode);//leftNode和rightNode中的最大值,表示以root节点为起点的最长同值路径长度
}
int longestUnivaluePath(TreeNode* root)
{
dfs(root);
return res;// +1 与 -1 抵消
}
};