给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。
注意:两个节点之间的路径长度由它们之间的边数表示。
示例 1:
输入:
5 / 4 5 / 1 1 5
输出:
2
示例 2:
输入:
1 / 4 5 / 4 4 5
输出:
2
注意: 给定的二叉树不超过10000个结点。 树的高度不超过1000。
code
/** * 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 { private: int longestUnivaluePathCore(TreeNode* node,int &maxPath) { if(!node) return 0; int leftRes=longestUnivaluePathCore(node->left,maxPath);//1.返回值为包含根节点的单侧最长路径 int rightRes=longestUnivaluePathCore(node->right,maxPath); int leftPath=0,rightPath=0; if(node->left&&node->val==node->left->val) leftPath=leftRes+1;//2.不能++leftRes,因为当前节点不一定与子树的值相同,不相同的时递归返回值为0 if(node->right&&node->val==node->right->val) rightPath=rightRes+1; maxPath=max(maxPath,leftPath+rightPath);//3.最长路径可能是包含根节点的双侧最长路径 return max(leftPath,rightPath);//返回单侧最长路径 } public: int longestUnivaluePath(TreeNode* root) { if(!root) return 0; int maxPath=0; longestUnivaluePathCore(root,maxPath); return maxPath; } };