边工作边刷题:70天一遍leetcode: day 89

Binary Tree Longest Consecutive Sequence
简单题,只要单向递增的
错误点:

  • +1,不是>=
  • 注意是top.left, top.right, 不是root.left, root.right:debug log:打印每层root.val和当前curlen

https://repl.it/Ccr6/3 (iteration: pre-order traversal)
https://repl.it/Ccr6/4 (recursion)

# Given a binary tree, find the length of the longest consecutive sequence path.

# The path refers to any sequence of nodes from some starting node to any node in the tree along the parent-child connections. The longest consecutive path need to be from parent to child (cannot be the reverse).

# For example,
#   1
#     \
#      3
#     / \
#   2   4
#         \
#          5
# Longest consecutive sequence path is 3-4-5, so return 3.
#   2
#     \
#      3
#     / 
#   2    
#   / 
#  1
# Longest consecutive sequence path is 2-3,not3-2-1, so return 2.

from collections import deque

# 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
        """
        if not root: return 0
        stk = deque([(root,1)])
        maxLen = 0
        while stk:
            top, curlen = stk.pop()
            maxLen = max(curlen, maxLen)

            if top.left:
                stk.append((top.left, curlen+1 if top.left.val==top.val+1 else 1)) # error: root.left
            
            if top.right:
                stk.append((top.right, curlen+1 if top.right.val==top.val+1 else 1))
        
        return maxLen
# 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, pre, curLen):
            if root.val==pre+1: # +1, not >= 
                curLen+=1
            else:
                curLen=1

            self.maxLen=max(self.maxLen, curLen)
            if root.left:
                dfs(root.left, root.val, curLen)
            
            if root.right:
                dfs(root.right, root.val, curLen)
        
        self.maxLen = 0
        if not root: return 0
        dfs(root, float('-inf'), 0)
        return self.maxLen
posted @ 2016-07-17 20:06  absolute100  阅读(117)  评论(0编辑  收藏  举报