题目:
Given a binary tree, find the length of the longest path where each node in the path has the same value. This path may or may not pass through the root.
Note: The length of path between two nodes is represented by the number of edges between them.
Example 1:
Input:
5 / \ 4 5 / \ \ 1 1 5
Output:
2
Example 2:
Input:
1 / \ 4 5 / \ \ 4 4 5
Output:
2
Note: The given binary tree has not more than 10000 nodes. The height of the tree is not more than 1000.
思路:
符合条件的path可以分为两种类型:1)经过root的;2)不经过root的。经过root的,其必然是从左边的某个leaf一致延伸到root,然后再从root延伸到右边的某个leaf,所以我们定义一个新的私有函数longestSubPath来实现计算。不经过root的可以通过递归调用root的左右子树来实现。
代码:
/**
* 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 longestUnivaluePath(TreeNode* root) {
if (root == NULL) {
return 0;
}
// type 1: the path that goes through the root
int ans1 = 0;
if (root->left && root->left->val == root->val) {
ans1 += longestSubPath(root->left) + 1;
}
if (root->right && root->right->val == root->val) {
ans1 += longestSubPath(root->right) + 1;
}
// type 2: the path that does not go through the root
int ans2 = longestUnivaluePath(root->left);
int ans3 = longestUnivaluePath(root->right);
return max(ans1, max(ans2, ans3));
}
private:
int longestSubPath(TreeNode* root) {
// get the longest sub path that goes from root to a leaf
if (root == NULL) {
return 0;
}
int ret = 0;
if (root->left && root->left->val == root->val) {
ret = longestSubPath(root->left) + 1;
}
if (root->right && root->right->val == root->val) {
ret = max(ret, longestSubPath(root->right) + 1);
}
return ret;
}
};