LeetCode面试298,二叉树最长连续序列(Python)

开始想着dfs,两种情况

1.以root为根

2.不以root为根

但是这样需要两个dfs分别进行,那么时间复杂度就上去了。

class Solution:def longestConsecutive(self, root: Optional[TreeNode]) -> int:def dfs(root):# 以root为根节点,可以延续几个点ans = 1if root.left and root.left.val - root.val == 1:ans = max(ans, 1+dfs(root.left))if root.right and root.right.val - root.val == 1:ans = max(ans, 1+dfs(root.right))return ansif not root: return 0ans = dfs(root)ans = max(ans, self.longestConsecutive(root.left), self.longestConsecutive(root.right))return ans

题解中提出一种思路可以同时进行dfs,只用把所有节点遍历一遍。

从上到下遍历,建立一个dfs(u, v, length),u为v的父节点,v为u的子节点,length以父节点为最后一个节点的序列长度(初始长度为1)

如果子节点刚好比父节点大1,那么length + 1,反之,length = 1

再继续遍历v的子节点

class Solution:def __init__(self):self.m = 1def longestConsecutive(self, root: Optional[TreeNode]) -> int:self.dfs(root, root, 1)return self.mdef dfs(self, u, v, length):# u为父节点,v为子节点,length为初始长度if not v: return if v.val - u.val == 1:length += 1self.m = max(self.m, length)else:length = 1self.dfs(v, v.left, length)self.dfs(v, v.right, length)

举一反三,还是按照之前的想法,不过只需要改变一点点,只有一种情况:

以root为根的最长序列

如果root.left.val - root.val==1,那么(以root为根的最长序列)可能就等于(以root.left为根的最长序列+1),如果root.right.val - root.val==1,那么(以root为根的最长序列)可能就等于(以root.right为根的最长序列+1),如果都不满足,那么返回1。

怎么有点像列表维护最长序列。其实就可以将链表想象成多方向的列表。

class Solution:def __init__(self):self.m = 1def longestConsecutive(self, root: Optional[TreeNode]) -> int:self.dfs(root)return self.mdef dfs(self, root):if not root:returnl, r = self.dfs(root.left), self.dfs(root.right)if root.left and root.left.val - root.val == 1:l += 1self.m = max(self.m, l)else:l = 0if root.right and root.right.val - root.val == 1:r += 1self.m = max(self.m, r)else:r = 0return max(1, l, r)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/675328.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

视频素材库在哪里找免费手机版?8个可以用手机浏览的素材网

在视觉内容占据主导地位的今天,合适的视频素材可以大大提升项目的吸引力和效果。以下列出的视频素材网站为广告制作者、社交媒体策略师及电影制作人提供了从传统到现代风格的各种视频素材选择,满足不同的创作需求。 1. 蛙学府(中国&#xff…

关系型数据库MySQL开发要点之多表设计案例详解代码实现

什么是多表设计 项目开发中 在进行数据库表结构设计时 根据数据模型和业务关系 会根据业务需求和业务模块之间的关系分析设计表结构 由于业务之间互相关联 所以表结构之间也存在着各种联系 主要分为以下三种 一对多 每个部门下是有多个员工的 但是一个员工只能归属一个部…

Linux —— 信号(3)

Linux —— 信号(3) Core dump为什么core默认是被关闭的阻塞信号信号其他相关常见概念信号递达信号未决信号阻塞两者的区别信号的结构 信号集操作函数一个简单使用例子sigpending的使用例子 我们今天接着来了解信号: Core dump 大家不知道有…

6.移除元素

文章目录 题目简介题目解答解法一:双指针代码:复杂度分析: 解法二:双指针优化代码:复杂度分析: 题目链接 大家好,我是晓星航。今天为大家带来的是 相关的讲解!😀 题目简…

6W 1.5KVDC. 单、双输出 DC/DC 电源模块——TP2L-6W 系列

TP2L-6W系列是一款高性能、超小型的电源模块,2:1电压输入,输出有稳压和连续短路保护功能,隔离电压为1.5KVDC、作温度范围为–40℃到85℃。特别适合对输出电压的精度有严格要求的地方,外部遥控功能对您的设计又多一项选择&#xff…

25考研英语长难句Day02

25考研英语长难句Day02 【a.词组】【b.断句】 如果你是你讲话对象中的一员,你就能了解你们大家共同的经历和问题,你也可以顺便评论一下食堂里难吃的食物或董事长臭名昭著的领带品味。 【a.词组】 单词解释addressv. 演说, 演讲;…

RS2103XH 功能和参数介绍及规格书

RS2103XH 是一款单刀双掷(SPDT)模拟开关芯片,主要用于各种模拟信号的切换和控制。下面是一些其主要的功能和参数介绍: 主要功能特点: 模拟信号切换:能够连接和断开模拟信号路径,提供灵活的信号路…

【教学类-50-14】20240505“数一数”图片样式12:数一数(12个“人物”图案)

作品展示 背景需求: 前文做了“”材料”图片的数一数学具,效果不错, https://blog.csdn.net/reasonsummer/article/details/138466325https://blog.csdn.net/reasonsummer/article/details/138466325 为了让图案内容更丰富,我又…

信创 | 信创产业数字化转型与升级:路径规划与实践!

信创产业的数字化转型与升级路径,主要围绕着构建国产化信息技术软硬件底层架构体系和全周期生态体系,解决核心技术关键环节“卡脖子”的问题,以推动中国经济数字化转型的平稳健康发展。 一、信创产业的发展趋势包括: 加强国产信息…

算法提高之能量项链

算法提高之能量项链 核心思想&#xff1a;区间dp 通过观察发现可以将n个珠子最后的n1个数看作石子 合并石子 在l~r的范围内 找k作隔断 #include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N 110,M N<<…

Java 线程池 ( Thread Pool )的简单介绍

想象一下&#xff0c;你正指挥着一支超级英雄团队&#xff0c;面对蜂拥而至的敌人&#xff08;任务&#xff09;&#xff0c;不是每次都召唤新英雄&#xff08;创建线程&#xff09;&#xff0c;而是精心调配现有成员&#xff0c;高效应对。这就是Java线程池的魔力&#xff0c;…

Python运维-日志记录、FTP、邮件提醒

本章目录如下&#xff1a; 五、日志记录 5.1、日志模块简介 5.2、logging模块的配置与使用 六、搭建FTP服务器与客户端 6.1、FTP服务器模式 6.2、搭建服务器 6.3、编写FTP客户端程序 七、邮件提醒 7.1、发送邮件 7.2、接收邮件 7.3、实例&#xff1a;将报警信息实时…