LeetCode 549. 二叉树中最长的连续序列(树上DP)
发布日期:2021-07-01 03:30:05 浏览次数:3 分类:技术文章

本文共 1429 字,大约阅读时间需要 4 分钟。

文章目录

1. 题目

给定一个二叉树,你需要找出二叉树中最长的连续序列路径的长度。

请注意,该路径可以是递增的或者是递减。

例如,[1,2,3,4] 和 [4,3,2,1] 都被认为是合法的,而路径 [1,2,4,3] 则不合法。
另一方面,路径可以是 子-父-子 顺序,并不一定是 父-子 顺序。

示例 1:输入:        1       / \      2   3输出: 2解释: 最长的连续路径是 [1, 2] 或者 [2, 1]。 示例 2:输入:        2       / \      1   3输出: 3解释: 最长的连续路径是 [1, 2, 3] 或者 [3, 2, 1]。 注意: 树上所有节点的值都在 [-1e7, 1e7] 范围内。

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/binary-tree-longest-consecutive-sequence-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

class Solution {
unordered_map
> dp; int maxlen = 0;public: int longestConsecutive(TreeNode* root) {
dfs(root); return maxlen; } void dfs(TreeNode* root) {
if(!root) return; dfs(root->left); dfs(root->right); dp[root] = {
1,1};//上升,下降,的最大长度 if(root->left) {
if(root->val == root->left->val+1)//左侧上升 dp[root][0] = max(dp[root][0], dp[root->left][0]+1); else if(root->val == root->left->val-1)//左侧下降 dp[root][1] = max(dp[root][1], dp[root->left][1]+1); } if(root->right) {
if(root->val == root->right->val+1)//右侧上升 dp[root][0] = max(dp[root][0], dp[root->right][0]+1); else if(root->val == root->right->val-1)//右侧下降 dp[root][1] = max(dp[root][1], dp[root->right][1]+1); } maxlen = max(maxlen, dp[root][0]+dp[root][1]-1); //以该节点为升降的和,-1为该节点重复计算1次 }};

44 ms 29.2 MB


我的CSDN

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!

Michael阿明

转载地址:https://michael.blog.csdn.net/article/details/107576568 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:LeetCode 1230. 抛掷硬币(DP)
下一篇:LeetCode 1272. 删除区间

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月15日 13时03分21秒