549 Binary Tree Longest Consecutive Sequence II
Description
Given a binary tree, you need to find the length of Longest Consecutive Path in Binary Tree.
Especially, 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:
1
/ \
2 3
Output:
2
Explanation:
The longest consecutive path is [1, 2] or [2, 1].
Example 2:
Input:
2
/ \
1 3
Output:
3
Explanation:
The longest consecutive path is [1, 2, 3] or [3, 2, 1].
Note:All the values of tree nodes are in the range of [-1e7, 1e7].
Note
Partial Right Solution
dfs,
- left decrease + right increase
- left increase + right decrease
- max of case 1 , case 2
Correct Solution
Also need to consider one more senarios:
calculate the max inc & max dec for sub nodes
calculate the inc & dec of current node (using the result from sub nodes)
Code
class Solution {
public:
int longestConsecutive(TreeNode* root) {
int rst = 0;
dfs(root, root, rst);
return rst;
}
private:
pair<int, int> dfs(TreeNode* node, TreeNode* next, int &rst) {
if(node == nullptr || next == nullptr) {
return make_pair(0,0);
}
auto left = dfs(next, next->left, rst);
auto right = dfs(next, next->right, rst);
rst = max(rst, left.first + right.second + 1);
rst = max(rst, left.second + right.first + 1);
int inc = 0, dec = 0;
if(node->val + 1 == next->val) {
inc = max(left.first, right.first) + 1;
}
else if(node->val - 1 == next->val) {
dec = max(left.second, right.second) + 1;
}
return make_pair(inc, dec);
}
};