给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。
注意:两个节点之间的路径长度由它们之间的边数表示。
示例 1:
输入:
5
/ \
4 5
/ \ \
1 1 5
输出:
2
示例 2:
输入:
1
/ \
4 5
/ \ \
4 4 5
输出:
2
注意: 给定的二叉树不超过10000个结点。 树的高度不超过1000。
思路分析: 以root为路径起始点的最长路径只有两种情况,
第一种是root和root-left,如图中以4为路径起始点->root->left
第二种是root和root-right,如图中以4为路径起始点->root->right
蛋式还有一种特殊情况,就是root是路径的中间节点。
不过还有一点需要的说明的是,下图这种情况最大只能算作2,因为路径只有一个起始一个末端。
/**
* 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 maxRes = 0;//最长的路径
int longestUnivaluePath(TreeNode* root) {
myFunc(root);
return maxRes;
}
//返回以root为路径起始点最长路径长
int myFunc(TreeNode* root){
if (root == NULL){
return 0;
}
int tempRes = 0;
int leftMaxVal = myFunc(root->left);//递归左子树
int rightMaxVal = myFunc(root->right);//递归右子树
//特殊情况,当root是最长路径的中间节点
if (root->left != NULL && root->right != NULL && root->left->val == root->right->val && root->left->val == root->val){
//这种情况只对于寻找最长路径长有帮助,对于搜索以root为路径起始点的最长路径没有帮助
maxRes = max(maxRes, leftMaxVal + rightMaxVal + 2);
}
//从左右子树中选择最长的路径
if (root->left != NULL && root->left->val == root->val){
tempRes = leftMaxVal + 1;
}
if (root->right != NULL && root->right->val == root->val){
tempRes = max(tempRes, rightMaxVal + 1);
}
maxRes = max(maxRes, tempRes);
return tempRes;
}
};