【leetcode】5338. 二叉樹中的最長交錯路徑( Longest ZigZag Path in a Binary Tree)


題目描述

【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;
    }
};

結果:
在這裏插入圖片描述

相關/參考鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章