题目: https://leetcode.com/problems/binary-tree-longest-consecutive-sequence/
难度 : Medium
思路:
TLE代码,每个node求,然后求最大值
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def longestConsecutive(self, root):
"""
:type root: TreeNode
:rtype: int
"""
def consecutive(root):
if root == None:
return 0
else:
left, right = 0,0
if root.left:
if root.left.val == root.val + 1:
left = 1 + consecutive(root.left)
if root.right:
if root.right.val == root.val + 1:
right = 1 + consecutive(root.right)
return max(left, right, 1)
def dfs(root):
s = []
s.append(root)
while s:
root = s.pop()
res.append(consecutive(root))
if root.left:
s.append(root.left)
if root.right:
s.append(root.right)
if not root:
return 0
res = []
dfs(root)
return max(res)
其实第二次递归,也就是dfs其实是有点多余的?因为可以边走边保存最大值?
因为可以
- recursion,在参数中包含当前的连续seq长度
- 如果left, right child的value是连续的,那么就将长度+1传入下一个call
AC代码
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def longestConsecutive(self, root):
"""
:type root: TreeNode
:rtype: int
"""
def dfs(root, curLen):
self.result = max(curLen, self.result)
if root.left:
if root.left.val == root.val + 1:
dfs(root.left, curLen + 1)
else:
dfs(root.left, 1)
if root.right:
if root.right.val == root.val + 1:
dfs(root.right, curLen + 1)
else:
dfs(root.right,1)
if not root: return 0
self.result = 0
dfs(root, 1)
return self.result
这里值得注意的是这里的self.result其实相当于dfs的全局变量,也是利用了这个才做到边递归边记录边重置。