題目描述
【leetcode】5338. 二叉樹中的最長交錯路徑( Longest ZigZag Path in a Binary Tree)
給你一棵以 root 爲根的二叉樹,二叉樹中的交錯路徑定義如下:
- 選擇二叉樹中 任意 節點和一個方向(左或者右)。
- 如果前進方向爲右,那麼移動到當前節點的的右子節點,否則移動到它的左子節點。
- 改變前進方向:左變右或者右變左。
- 重複第二步和第三步,直到你在樹中無法繼續移動。
- 交錯路徑的長度定義爲:訪問過的節點數目 - 1(單個節點的路徑長度爲 0 )。
請你返回給定樹中最長 交錯路徑 的長度。
示例 1:
輸入:root = [1,null,1,1,1,null,null,1,1,null,1,null,null,null,1,null,1]
輸出:3
解釋:藍色節點爲樹中最長交錯路徑(右 -> 左 -> 右)。
示例 2:
輸入:root = [1,1,1,null,1,null,null,1,1,null,1]
輸出:4
解釋:藍色節點爲樹中最長交錯路徑(左 -> 右 -> 左 -> 右)。
示例 3:
輸入:root = [1]
輸出:0
提示:
- 每棵樹最多有 50000 個節點。
- 每個節點的值在 [1, 100] 之間。
第一次解答
思路
深度優先遍歷,注意不一定要從根結點開始。
一開始想:要判斷最大,所以路徑長度不是在遞歸最深處給出,而是從最深處不斷返回到根節點,才能判斷是否最大。
後來轉念一想:因爲路徑起始點不一定在根節點,所以還得在遞歸最深處取數據。
代碼:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
#include <cmath>
class Solution {
public:
void helper(TreeNode* root, bool is_left, int &max_path, int curr_path){
if(nullptr == root){
return;
}
curr_path += 1;
if(curr_path > max_path){
max_path = curr_path;
}
TreeNode *p_next = (is_left ? root->left : root->right);
helper(p_next, !is_left, max_path, curr_path); // 按規則,繼續走折線
TreeNode *p_next2 = (is_left ? root->right : root->left);
helper(p_next2, is_left, max_path, 0); // 不按規則,重新走折線
return;
}
int longestZigZag(TreeNode* root) {
if(nullptr == root)
return 0;
int max_path = 0;
helper(root->right, true, max_path, 0); // L
helper(root->left, false, max_path, 0); // R
return max_path;
}
};
結果: