给定一个二叉树的 root ,返回 最长的路径的长度 ,这个路径中的 每个节点具有相同值 。 这条路径可以经过也可以不经过根节点。
两个节点之间的路径长度 由它们之间的边数表示。
示例 1:
输入:root = [5,4,5,1,1,5]
输出:2
示例 2:
输入:root = [1,4,5,4,4,5]
输出:2
提示:
树的节点数的范围是 [0, 104]
-1000 <= Node.val <= 1000
树的深度将不超过 1000
解题思路
DFS深度遍历
- DFS函数递归计算每个节点左右子节点的相同值长度
- 若当前节点和两边若有相同,则左右长度分别加一,否则左右长度分别就变为0
- 将此时的左右深度相加与全局答案比较更新
- 注意返回值:返回左右深度中的最大值(如此在上层节点计算时才能形成一条线,而不是变成带分支的树)。
代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int longestUnivaluePath(TreeNode* root) {
int ans = 0;
dfs(root,ans);
return ans;
}
int dfs(TreeNode* root, int &ans){
// 计算 最长的路径的长度 ,并返回当前节点的的往下相同节点最深的深度
if(root == NULL) return 0;
int left_len = dfs(root->left,ans), right_len = dfs(root->right,ans); // 左右子树往下相同节点最深的深度
if(root->left && root->val == root->left->val) left_len++;
else left_len = 0; // 不相等则深度为0;
if(root->right && root->val == root->right->val) right_len++;
else right_len = 0; // 不相等则深度为0;
ans = max(ans,left_len+right_len);
return max(left_len, right_len);
}
};