給定一個二叉樹,找到最長的路徑,這個路徑中的每個節點具有相同值。 這條路徑可以經過也可以不經過根節點。
注意:兩個節點之間的路徑長度由它們之間的邊數表示。
示例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;
}
};