Given a binary tree root
, a ZigZag path for a binary tree is defined as follow:
- Choose any node in the binary tree and a direction (right or left).
- If the current direction is right then move to the right child of the current node otherwise move to the left child.
- Change the direction from right to left or right to left.
- Repeat the second and third step until you can't move in the tree.
Zigzag length is defined as the number of nodes visited - 1. (A single node has a length of 0).
Return the longest ZigZag path contained in that tree.
Example 1:
Input: root = [1,null,1,1,1,null,null,1,1,null,1,null,null,null,1,null,1] Output: 3 Explanation: Longest ZigZag path in blue nodes (right -> left -> right).
Example 2:
Input: root = [1,1,1,null,1,null,null,1,1,null,1] Output: 4 Explanation: Longest ZigZag path in blue nodes (left -> right -> left -> right).
Example 3:
Input: root = [1] Output: 0
Constraints:
- Each tree has at most
50000
nodes.. - Each node's value is between
[1, 100]
.
Related Topics:
Dynamic Programming, Tree
// OJ: https://leetcode.com/problems/longest-zigzag-path-in-a-binary-tree
// Author: github.com/lzl124631x
// Time: O(N)
// Space: O(H)
class Solution {
int A = 0;
pair<int, int> postorder(TreeNode* root) {
if (!root || (!root->left && !root->right)) return { 0, 0 };
pair<int, int> ans;
if (root->left) {
auto left = postorder(root->left);
ans.first = 1 + left.second;
}
if (root->right) {
auto right = postorder(root->right);
ans.second = 1 + right.first;
}
A = max({ A, ans.first, ans.second });
return ans;
}
public:
int longestZigZag(TreeNode* root) {
postorder(root);
return A;
}
};