给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。
注意:两个节点之间的路径长度由它们之间的边数表示。
示例1
输入:
5
/ \
4 5
/ \ \
1 1 5
输出:
2
解题思想:使用递归
-
判断当前节点是否为空,若为空则返回 0
-
若不为空,获得当前节点的左右儿子的最长同值路径left,right
- 将左儿子的值与当前节点的值比较。若相等left=left+1,不等则置left=0
- 将右儿子的值与当前节点的值比较。若相等right=right+1,不等则置right=0
- 将(right+left)与最长同值路径相比,若大于最长同值路径则更新值
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
*};
*/
class Solution {
public:
int sum = 0;
int Solve(TreeNode* root){
if(root==NULL) return 0;
int left = Solve(root->left);
int right = Solve(root->right);
left = (root->left!=NULL && root->left->val==root->val)?left+1:0;
right = (root->right!=NULL && root->right->val==root->val)?right+1:0;
sum = (right+left)>sum?(right+left):sum;
return right>left?right:left;
}
int longestUnivaluePath(TreeNode* root) {
Solve(root);
return sum;
}
};