687. 最长同值路径
难度
中等

 

 

给定一个二叉树的 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

 

思路:

统计最长同值路径我们需要从子树返回到根,判断子树的同值路径中的值是否和根部相同,

此时有四种情况 左子树和根部相同 右子树和根相同,或者两个都相同,或者三个都不同

每有一个和根部相同的值,就在当前节点的返回值的基础上加上其子树返回来的同值路径的长度上加1,与全局变量最长同值路径作比较,需要注意的一点是,如果左右子树都和根相同,像上层返回时须返回更长的同值子树,因为路径不可以分叉

 

recur函数接收参数val的引用,获得子树的同值路径的值,并且通过返回值返回同值路径的长度。

 

AC代码如下

复制代码
 1 class Solution {
 2 public:
 3     int res=0;
 4     int longestUnivaluePath(TreeNode* root) {
 5         //捏妈 题目没看清楚 我说怎么这么简单
 6         //后续遍历
 7         int val=1001;
 8          recur(root,val);
 9          return res;
10     }
11     int recur(TreeNode* root,int& val){
12         //到达一个节点时,我们分别求其左右子树的最大路径长度
13         if(root==nullptr) return 0;
14         int left=1001;
15         int right=-1001;
16         int l=recur(root->left,left);
17         int r=recur(root->right,right);
18         int c=0;
19         if(left==root->val) {
20             c+=l+1;
21         }
22         if(right==root->val){
23              c+=r+1;
24         }
25         res=max(res,c);
26         
27         val=root->val;
28         if(left==root->val&&right==root->val) return l>r?l+1:r+1;
29         return c;
30     }
31 
32 };
复制代码