题目不长,就是分析时间太久了。
思路使用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语句!!!
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