--- tags: leetcode --- # [549. Binary Tree Longest Consecutive Sequence II](https://leetcode.com/problems/binary-tree-longest-consecutive-sequence-ii/) --- # My Solution ## The Key Idea for Solving This Coding Question DFS, recursion, postorder traversal ## C++ Code 1 ```cpp= /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ struct LenData { int incLen; int decLen; LenData(int incLen, int decLen) : incLen(incLen), decLen(decLen) {} }; class Solution { public: int longestConsecutive(TreeNode *root) { int longest = 0; dfs(root, longest); return longest; } private: LenData dfs(TreeNode *root, int &longest) { if (root == nullptr) { return LenData(0, 0); } int incLen = 1, decLen = 1; if (root->left != nullptr) { LenData leftData = dfs(root->left, longest); if (root->val + 1 == root->left->val) { leftData.incLen += 1; } else { leftData.incLen = 1; } if (root->val == root->left->val + 1) { leftData.decLen += 1; } else { leftData.decLen = 1; } incLen = max(incLen, leftData.incLen); decLen = max(decLen, leftData.decLen); } if (root->right != nullptr) { LenData rightData = dfs(root->right, longest); if (root->val + 1 == root->right->val) { rightData.incLen += 1; } else { rightData.incLen = 1; } if (root->val == root->right->val + 1) { rightData.decLen += 1; } else { rightData.decLen = 1; } incLen = max(incLen, rightData.incLen); decLen = max(decLen, rightData.decLen); } longest = max(longest, incLen + decLen - 1); return LenData(incLen, decLen); } }; ``` :::spoiler Code 1 的第二種寫法 ```cpp= /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ struct lenData { int incLen; int decLen; lenData(int incLen, int decLen) : incLen(incLen), decLen(decLen) {} }; class Solution { public: int longestConsecutive(TreeNode *root) { int longest = 0; dfs(root, longest); return longest; } private: lenData dfs(TreeNode *root, int &longest) { if (root == nullptr) { return lenData(0, 0); } int incLen = 1, decLen = 1; if (root->left != nullptr) { lenData leftLen = dfs(root->left, longest); if (root->val == root->left->val + 1) { decLen = max(decLen, leftLen.decLen + 1); } else if (root->val + 1 == root->left->val) { incLen = max(incLen, leftLen.incLen + 1); } } if (root->right != nullptr) { lenData rightLen = dfs(root->right, longest); if (root->val == root->right->val + 1) { decLen = max(decLen, rightLen.decLen + 1); } else if (root->val + 1 == root->right->val) { incLen = max(incLen, rightLen.incLen + 1); } } longest = max(longest, incLen + decLen - 1); return lenData(incLen, decLen); } }; ``` ::: ## C++ Code 2 ```cpp= /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ struct lenData { int incLen; int decLen; lenData(int incLen, int decLen) : incLen(incLen), decLen(decLen) {} }; class Solution { public: int longestConsecutive(TreeNode *root) { int longest = 1; dfs(nullptr, root, longest); return longest; } private: // dfs returns the increasing and descreasing consequtive length // from the parent of root. lenData dfs(TreeNode *parent, TreeNode *root, int &longest) { if (root == nullptr) { return lenData(1, 1); } lenData leftData = dfs(root, root->left, longest); lenData rightData = dfs(root, root->right, longest); int incLen = max(leftData.incLen, rightData.incLen); int decLen = max(leftData.decLen, rightData.decLen); longest = max(longest, incLen + decLen - 1); if (parent != nullptr) { if (parent->val + 1 == root->val) { int max1 = max(incLen + 1, incLen + decLen - 1); longest = max(longest, max1); return lenData(incLen + 1, 1); } if (parent->val == root->val + 1) { int max2 = max(decLen +1, incLen + decLen - 1); longest = max(longest, max2); return lenData(1, decLen + 1); } return lenData(1, 1); } return lenData(incLen, decLen); } }; ``` :::spoiler Code 2 的第二種寫法 ```cpp= /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ struct lenData { int incLen; int decLen; lenData(int incLen, int decLen) : incLen(incLen), decLen(decLen) {} }; class Solution { public: int longestConsecutive(TreeNode *root) { int longest = 1; dfs(nullptr, root, longest); return longest; } private: // dfs returns the increasing and descreasing consequtive length // from the parent of root. lenData dfs(TreeNode *parent, TreeNode *root, int &longest) { if (root == nullptr) { return lenData(1, 1); } lenData leftData = dfs(root, root->left, longest); lenData rightData = dfs(root, root->right, longest); int incLen = max(leftData.incLen, rightData.incLen); int decLen = max(leftData.decLen, rightData.decLen); longest = max(longest, incLen + decLen - 1); if (parent != nullptr) { if (parent->val + 1 == root->val) { int max1 = max(incLen + 1, incLen + decLen - 1); longest = max(longest, max1); return lenData(incLen + 1, 1); } if (parent->val == root->val + 1) { int max2 = max(decLen +1, incLen + decLen - 1); longest = max(longest, max2); return lenData(1, decLen + 1); } return lenData(1, 1); } return lenData(incLen, decLen); } }; ``` ::: ## Time Complexity $O(n)$ $n$ is the number of nodes in the binary tree referred by `root`. ## Space Complexity $O(H)$ $H$ is the height of the binary tree referred by `root`. # Miscellaneous [298. Binary Tree Longest Consecutive Sequence](https://leetcode.com/problems/binary-tree-longest-consecutive-sequence) <!-- # Test Cases ``` [1,2,3] ``` ``` [2,1,3] ``` * Wrong Answer ``` [1,1,1] ``` * Wrong Answer ``` [4,2,null,1,3] ``` * Wrong Answer ``` [42,10,11,60,65,50,98,66,84,35,97,-6,null,-1,73,2,61,8,20,11,21,13,50,88,89,20,59,65,66,null,81,-7,12,20,-5,82,-8,96,44,58,91,31,65,29,3,93,74,null,null,10,-4,91,55,85,20,52,18,null,null,11,6,91,6,58,82,null,null,21,null,84,null,7,31,null,-9,57,32,94,61,44,61,35,31,-7,54,15,75,21,-9,65,57,74,null,-2,89,24,6,95,null,null,47,null,null,79,null,36,31,79,86,9,5,86,92,-4,83,76,3,24,10,1,10,72,95,43,0,null,38,41,40,-6,10,93,62,94,82,4,-3,25,91,19,36,null,95,37,67,13,15,18,39,57,13,64,50,null,null,26,-3,-7,99,null,-9,77,16,91,9,null,null,null,26,null,78,83,19,76,92,74,96,46,14,null,null,8,98,null,null,26,null,-7,64,39,91,79,60,80,10,3,-2,29,85,53,70,50,24,null,56,null,null,33,null,-5,71,8,62,72,35,83,null,null,null,14,85,-5,17,null,5,2,14,-8,3,73,49,null,89,null,84,null,85,-3,16,8,-9,null,null,91,18,76,null,5,58,58,4,null,null,null,null,95,null,-3,82,99,6,null,null,49,58,-3,54,91,63,null,12,null,26,34,64,93,null,null,null,null,25,-9,91,64,33,76,27,null,null,80,null,null,null,50,68,null,null,null,10,null,null,60,null,null,50,8,null,30,35,36,5,17,22,61,38,40,null,12,98,68,65,60,48,null,20,44,20,59,78,10,91,81,8,3,27,61,null,69,null,53,null,null,null,null,null,92,null,null,null,99,91,15,71,21,66,37,5,null,null,null,12,52,null,null,7,69,28,null,null,68,13,94,76,null,null,null,82,-7,94,null,null,null,42,null,3,null,22,null,25,null,89,99,null,74,60,93,25,75,56,null,14,null,1,24,6,null,null,null,null,-1,null,null,66,3,73,91,60,null,null,16,42,17,81,14,96,33,null,55,null,null,-9,67,4,9,53,null,null,null,null,null,null,null,null,null,42,96,null,29,16,59,null,-3,56,90,null,72,null,null,87,null,null,null,null,null,null,null,null,null,75,null,null,54,null,4,39,-2,null,44,80,14,null,95,8,76,19,null,null,null,null,null,null,null,66,null,68,92,94,5,8,96,null,80,null,null,null,40,52,30,-7,85,null,72,90,1,44,4,59,19,null,null,null,-9,-8,32,63,1,null,25,null,21,33,37,96,-1,43,null,83,80,65,68,99,88,null,48,77,14,null,14,8,null,null,null,null,null,null,null,null,null,89,null,null,14,null,37,null,null,null,null,null,null,null,20,null,null,null,61,20,null,null,null,34,50,53,null,null,51,null,98,25,42,77,59,36,18,68,4,-5,36,71,null,37,78,null,null,null,null,null,null,null,null,null,null,44,74,92,null,null,3,21,76,32,79,null,59,3,86,-9,81,-4,null,null,null,31,61,32,null,null,98,null,-8,5,64,null,43,32,null,78,null,36,null,null,null,48,null,null,null,78,71,null,71,80,12,null,null,null,null,null,29,52,1,83,5,95,2,56,93,65,86,95,null,null,null,null,58,7,null,20,-2,84,null,-9,13,null,null,33,null,58,null,null,0,38,null,null,-9,null,88,null,78,24,null,14,null,null,9,75,53,-3,null,88,71,84,76,62,85,53,null,null,null,79,36,-5,null,91,57,17,null,null,null,null,36,12,-7,51,63,-3,77,40,13,17,10,5,89,-4,72,27,53,null,83,65,null,null,null,null,null,33,null,96,null,null,85,60,9,38,23,null,null,null,39,null,null,null,16,85,99,51,null,null,null,null,null,null,54,null,null,62,null,null,57,90,61,99,69,2,23,71,35,null,-4,51,-1,null,30,3,null,null,17,42,null,null,77,95,39,85,null,-8,43,5,86,null,33,56,47,78,9,70,57,3,29,71,null,null,null,null,null,null,null,null,47,92,85,38,-3,null,null,22,null,null,34,37,null,86,79,68,84,null,null,null,null,null,null,null,78,58,null,null,49,null,null,11,null,null,null,null,null,null,null,88,65,null,50,null,52,null,55,null,13,0,null,null,null,null,30,86,60,68,48,85,null,null,null,20,null,null,null,39,52,77,62,null,82,-6,null,null,60,null,71,null,null,null,39,0,53,null,null,11,null,null,null,3,85,3,78,null,78,-1,30,72,null,null,null,null,35,29,40,79,86,12,21,null,48,46,70,98,62,22,93,null,null,null,null,null,null,null,45,null,null,null,null,null,-6,null,null,null,null,71,null,null,null,null,68,null,41,93,null,null,62,78,-7,14,null,19,16,91,null,null,null,null,null,20,90,51,42,null,null,93,85,null,null,58,9,null,-3,27,86,42,null,null,null,null,null,17,null,null,null,null,22,-8,93,8,49,90,null,null,63,19,39,null,null,null,17,4,54,8,-5,76,null,null,-9,-6,null,34,null,51,10,20,null,23,14,91,26,47,null,47,67,null,null,26,null,null,null,null,null,null,null,null,34,null,15,0,85,13,3,88,86,null,80,39,33,null,52,null,null,39,null,-4,21,null,null,null,2,89,null,null,-1,-6,null,17,-1,65,null,null,null,null,null,19,null,null,63,null,null,null,null,null,-1,68,null,null,null,null,null,null,null,null,17,null,null,null,93,42,null,null,null,12,null,null,null,92,85,82,8,null,null,34,18,90,50,null,99,89,null,19,null,null,78,null,74,-2,null,null,null,63,null,null,38,38,null,null,null,null,null,null,null,null,null,null,74,null,8,null,null,null,49,null,null,null,21,0,null,2,60,15,36,83,59,54,null,-3,null,null,null,-8,null,5,49,32,null,null,null,null,null,7,null,null,null,55,null,null,26,78,98,null,null,57,null,null,83,63,null,null,null,null,81,null,null,33,null,null,null,null,null,null,16,14,null,null,-4,44,null,null,37,16,16,33,null,84,null,25,10,null,null,30,null,null,null,null,null,null,65,null,null,null,93,null,null,null,44,57,12,52,-4,67,null,49,null,null,null,null,null,null,null,64,17,null,null,null,83,4,61,75,null,null,null,null,null,null,24,null,78,-7,null,-5,null,null,30,79,null,44,94,55,14,59,null,null,null,null,null,null,60,null,null,null,null,25,null,null,null,null,97,34,null,null,null,null,80,67,0,null,22,null,96,null,null,null,null,null,null,null,null,47,null,null,null,null,89,null,null,null,null,43,64,null,null,9,null,null,96,37,79,null,null,null,28,81,null,null,5,null,null,7,96,41,82,-6,20,null,null,null,8,null,null,null,null,null,null,null,null,null,82,8,null,null,null,null,null,null,null,null,39,6,null,null,null,null,90,59,-8,null,null,null,null,null,23,null,null,null,15,89,null,null,86,50,40,70,null,null,32,null,null,null,44,-2,null,38,39,null,null,null,null,null,null,null,null,null,2,null,null,null,null,2,null,null,65,47,null,null,62,27,62,38,31,27,null,null,37,null,null,null,null,null,null,null,62,74,86,-7,null,23,null,null,56,null,null,null,6,null,86,72,30,null,null,21,41,92,null,null,null,null,22,null,74,96,87,null,null,null,null,null,-7,null,51,34,80,null,null,null,null,null,null,null,16,20,null,null,15,81,null,55,null,61,null,null,22,null,5,14,null,34,23,null,30,null,6,64,2,65,null,54,null,null,14,null,0,null,null,null,26,null,null,78,null,49,null,null,13,null,null,null,43,null,null,-1,41,33,null,5,78,null,null,null,null,null,null,null,null,null,null,75,null,null,null,null,null,null,63,70,null,null,null,null,null,40,null,null,null,66,null,null,15,null,7,43,null,60,12,null,null,null,null,null,null,null,19,null,74,-5,55,null,null,null,null,52,-4,-5,null,null,null,65,null,null,67,null,3,null,null,95,null,null,36,null,81,null,null,null,null,null,88,74,null,67,null,null,null,null,68,null,null,null,null,52,null,null,82,90,75,25,null,23,null,68,6,11,null,59,null,null,null,null,null,null,null,null,-2,null,null,null,61,null,null,null,32,80,null,null,null,51,6,null,91,null,null,37,null,26,null,78,null,null,null,null,null,null,null,34,null,null,null,null,null,null,24,31,null,null,99,56,null,null,62,12,43,null,null,null,null,null,null,33,null,68,null,null,null,null,53,4,65,4,null,86,null,46,-9,null,null,83,null,null,null,null,93,null,null,78,null,63,null,null,null,null,null,67,null,null,null,null,72,93,25,null,null,27,null,null,92,44,null,null,null,null,2,9,31,null,null,73,92,62,86,null,null,-6,null,null,null,null,58,null,null,null,null,null,null,null,null,54,null,null,null,null,null,null,null,null,16,null,null,null,null,null,null,null,null,null,null,null,28,null,48,null,null,null,null,null,26,null,null,null,null,null,null,37,66,null,null,92,null,null,null,null,86,89,null,null,null,null,null,null,5,85,null,null,75,null,35,null,null,null,null,null,null,null,27,null,null,null,null,null,null,67,84,94,44,null,null,null,null,null,null,null,null,null,null,70,null,null,49,null,null,16,null,null,null,null,null,null,null,87,null,-7,52,null,null,null,67,null,null,null,null,null,null,null,null,null,null,null,null,null,null,80,null,76,null,25,null,91,null,12,41,null,null,26,null,null,null,null,null,null,null,null,null,null,null,null,null,null,94] ``` -->