思考:
1.每一個點都要走到 --> DFS
2.如何控制走的左右子點方向
3.如何判斷這個節點是父節點的右子還是左子
```c++=
/**
* 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) {}
* };
*/
class Solution {
public:
int maxLength = 0; // 用於記錄最長交錯路徑的長度
// dir 表示父點來的方向(0 為左,1 為右),
// currLength 表示從父節點到當前節點的交錯路徑長度
void solve(TreeNode* root, int dir, int currLength) {
if (root == NULL){
return; // 若節點為空,則返回
}
// 更新最長交錯路徑長度為當前長度和 maxLength 中的較大值
maxLength = max(maxLength, currLength);
// 往左點走 方向設為 0, 如果上一個路徑是 1 的話代表條件成立 路徑長度+1 否則歸1
solve(root->left, 0, dir ? currLength + 1 : 1);
// 往右點走 方向設為 1, 如果上一個路徑是 0 的話代表條件成立 路徑長度+1 否則歸1
solve(root->right, 1, dir ? 1 : currLength + 1);
}
int longestZigZag(TreeNode* root) {
solve(root, 0, 0);
return maxLength;
}
};
```
```c++=
/**
* 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) {}
* };
*/
class Solution {
public:
int maxPath = 0;
void DFS(TreeNode* root, int dir, int currL){
if(root == NULL){
return;
}
//紀錄最大路徑
//來源相反就++而已
maxPath = max(maxPath, currL);
DFS(root->left, 0, dir ? currL +1 : 1);
DFS(root->right, 1, dir ? 1 : currL +1);
}
int longestZigZag(TreeNode* root) {
DFS(root, 0, 0);
return maxPath;
}
};
```