leetcode 1372

问题

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:

img

1
2
3
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:

img

1
2
3
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:

1
2
Input: root = [1]
Output: 0

Constraints:

  • Each tree has at most 50000 nodes..
  • Each node’s value is between [1, 100].

分析

注意dp可以有多个返回值,要对每个节点进行处理,回溯时在进行总和。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
// [0]: as left in
// [1]: as right in
vector<int> dp(TreeNode *root) {
if (!root) return {0, 0, 0};
vector<int> l = dp(root->left);
vector<int> r = dp(root->right);
vector<int> ret(3, 0);
ret[0] = root->right? r[1]+1: 0;
ret[1] = root->left? l[0]+1: 0;
ret[2] = max(max(ret[0], ret[1]), max(l[2], r[2]));
return ret;
}
int longestZigZag(TreeNode* root) {
return dp(root)[2];
}
};