?题目描述
给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。
注意:两个节点之间的路径长度由它们之间的边数表示。
示例 1:
输入:
5
/ \
4 5
/ \ \
1 1 5
输出:
2
示例 2:
输入:
1
/ \
4 5
/ \ \
4 4 5
输出:
2
注意: 给定的二叉树不超过10000个结点。 树的高度不超过1000。
?Solution : Recursion
![](https://i-blog.csdnimg.cn/blog_migrate/7cab3c2e6f72c09f4db78f2d634c54a4.png)
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
/**
中心思想:自底向上的求分别过每个节点的单侧等值最大路径长度,本节点左侧右侧之和来同步更新最值
解题思路:对于任意一个节点, 如果最长同值路径包含该节点, 那么只可能是两种情况:
1. 其左右子树中加上该节点后所构成的同值路径中较长的那个继续向父节点回溯构成最长同值路径
2. 左右子树加上该节点都在最长同值路径中, 构成了最终的最长同值路径
需要注意因为要求同值, 所以在判断左右子树能构成的同值路径时要加入当前节点的值作为判断依据
*/
class Solution {
public:
int longestUnivaluePath(TreeNode* root) {
if (root == nullptr) return 0;
int ans = 0;
univaluePath(root, &ans);
return ans;
}
private:
//获取经过本点的单侧等值最大路径长度
int univaluePath(TreeNode *root, int *ans) {
if (root == nullptr) return 0;
//获取经过本左子点的单侧等值最大路径长度
int l = univaluePath(root->left, ans);
//获取经过本右子点的单侧等值最大路径长度
int r = univaluePath(root->right, ans);
int pl = 0;
int pr = 0;
//注意要判断左(右)子树是否存在
if (root->left && root->left->val == root->val) pl = l + 1;
if (root->right && root->right->val == root->val) pr = r + 1;
*ans = max(*ans, pl + pr);
return max(pl, pr);
}
};