Formatted question description: https://leetcode.ca/all/549.html

# 549. Binary Tree Longest Consecutive Sequence II

## Description

Given the root of a binary tree, return the length of the longest consecutive path in the tree.

A consecutive path is a path where the values of the consecutive nodes in the path differ by one. This path can be either increasing or decreasing.

• For example, [1,2,3,4] and [4,3,2,1] are both considered valid, but the path [1,2,4,3] is not valid.

On the other hand, the path can be in the child-Parent-child order, where not necessarily be parent-child order.

Example 1: Input: root = [1,2,3]
Output: 2
Explanation: The longest consecutive path is [1, 2] or [2, 1].


Example 2: Input: root = [2,1,3]
Output: 3
Explanation: The longest consecutive path is [1, 2, 3] or [3, 2, 1].


Constraints:

• The number of nodes in the tree is in the range [1, 3 * 104].
• -3 * 104 <= Node.val <= 3 * 104

## Solutions

• 
public class Binary_Tree_Longest_Consecutive_Sequence_II {

class Solution {
public int longestConsecutive(TreeNode root) {

if (root == null) {
return 0;
}

int res = helper(root, 1) + helper(root, -1) + 1; // +1 is increasing, -1 is decreasing
return Math.max(res, Math.max(longestConsecutive(root.left), longestConsecutive(root.right)));
}

int helper(TreeNode node, int diff) {
if (node == null) {
return 0;
}

int left = 0, right = 0;
if (node.left != null && node.val - node.left.val == diff) {
left = 1 + helper(node.left, diff);
}
if (node.right != null && node.val - node.right.val == diff) {
right = 1 + helper(node.right, diff);
}

return Math.max(left, right);
}
}
}

• // OJ: https://leetcode.com/problems/binary-tree-longest-consecutive-sequence-ii/
// Time: O(N)
// Space: O(H)
class Solution {
int ans = 0;
pair<int, int> dfs(TreeNode *root) {
if (!root) return {0, 0};
auto [linc, ldec] = dfs(root->left);
auto [rinc, rdec] = dfs(root->right);
if (root->left) {
if (root->val != root->left->val + 1) linc = 0;
if (root->val != root->left->val - 1) ldec = 0;
}
if (root->right) {
if (root->val != root->right->val + 1) rinc = 0;
if (root->val != root->right->val - 1) rdec = 0;
}
ans = max({ ans, ldec + rinc + 1, rdec + linc + 1 });
return { max(linc, rinc) + 1, max(ldec, rdec) + 1 };
}
public:
int longestConsecutive(TreeNode* root) {
dfs(root);
return ans;
}
};

• # 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):
if not root:
return None, 0, 0, 0  # increasing length, decreasing length, global max length
inc = dec = 1
left, leftInc, leftDec, leftMax = dfs(root.left)
right, rightInc, rightDec, rightMax = dfs(root.right)
if root.val + 1 == left:
inc = max(leftInc + 1, inc)
if root.val - 1 == left:
dec = max(leftDec + 1, dec)
if root.val + 1 == right:
inc = max(rightInc + 1, inc)
if root.val - 1 == right:
dec = max(rightDec + 1, dec)
return root.val, inc, dec, max(inc + dec - 1, leftMax, rightMax, inc, dec)

return dfs(root)