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 };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理