leetcode尊享面试100题(549二叉树最长连续序列||,python)

题目不长,就是分析时间太久了。

思路使用dfs深度遍历,先想好这个函数返回什么,题目给出路径可以是子-父-子的路径,那么1-2-3可以,3-2-1也可以,那么考虑dfs返回两个值,对于当前节点node来说,返回一个顺序的长度的最大值p,一个逆序长度的最大值b,初始值都为1。例如,当前节点值为3,下面有两个子节点1-2,那么p为3,b仍为1。

这是返回的值,那么对于当前节点,以node为终点的最大长度=max(p,b),还有一种经过node节点的路径需要考虑,例如,左节点为1,右节点为3,当前节点为2。

这题需要把所有的情况罗列一遍,就是多几个if语句!!!

python 复制代码
class Solution:
    def __init__(self):
        self.m = 1

    def longestConsecutive(self, root: Optional[TreeNode]) -> int:
        self.dfs(root)
        return self.m
    
    def dfs(self, node):
        if not node: return 0, 0
        p, b, m = 1, 1, 1
        p1, b1 = self.dfs(node.left)
        p2, b2 = self.dfs(node.right)
        if node.left and abs(node.left.val - node.val) == 1:
            if node.left.val - node.val == -1:
                p = max(p, p1 + 1)
            else:
                b = max(b, b1 + 1)
        if node.right and abs(node.right.val - node.val) == 1:
            if node.right.val - node.val == -1:
                p = max(p, p2 + 1)
            else:
                b = max(b, b2 + 1)
        if node.left and node.right and node.left.val - node.val ==  node.val - node.right.val:
            if node.left.val - node.val == -1:
                m = b2 + p1 + 1
            elif node.left.val - node.val == 1:
                m = b1 + p2 + 1
        self.m = max(self.m, p, b, m)
        return p, b
相关推荐
We་ct几秒前
LeetCode 34. 在排序数组中查找元素的第一个和最后一个位置:二分查找实战
前端·算法·leetcode·typescript·二分
啊我不会诶13 分钟前
求LCA 倍增法
c++·算法·深度优先
2401_8747325329 分钟前
Python Web爬虫入门:使用Requests和BeautifulSoup
jvm·数据库·python
NAGNIP31 分钟前
面试官:给我讲一下卷积吧!
算法·面试
NAGNIP37 分钟前
一文搞懂卷积神经网络!
算法·面试
平常心cyk1 小时前
Python基础快速复习——集合和字典
开发语言·数据结构·python
阿钱真强道1 小时前
34 Python 离群点检测:什么是离群点?为什么要做异常检测?
python·sklearn·异常检测·异常·离群点检测
AC赳赳老秦1 小时前
OpenClaw关键词挖掘Agent配置(附SOP脚本,可直接复制使用)
java·大数据·开发语言·人工智能·python·pygame·openclaw
ccLianLian1 小时前
leetcode-hot100
算法·leetcode·职场和发展
qq_416018721 小时前
数据分析与科学计算
jvm·数据库·python