iT邦幫忙

2026 iThome 鐵人賽

DAY 15
0
Software Development

30天刷完leetcoode75系列 第 15 篇

C++ 演算法練習 Day15|1448, 1372 題解與思路分享

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20260929/20184265wU5cf8fDBO.png

題目解析: 給定一棵二元樹,如果從根節點走到某個節點的路徑上,沒有任何節點的數值大於該節點的值,這就被稱為「好節點」,目標是找出整棵樹共有幾個好節點
解題思路: 設一個變數ans來記數量。把根節點跟目前路徑的最大值(起點就是根節點本身的值)丟進DFS函數開始遞迴。每次進函數就先檢查目前節點的值有沒有大於等於傳進來的最大值,有的話ans就加1。接著更新最大值,繼續往左右子節點遞迴找下去,最後回傳ans

class Solution {
public:
    int ans = 0;
    int goodNodes(TreeNode* root) {
        int q = root->val;
        DFS(root, q);

        return ans;
    }

    void DFS(TreeNode* now, int q1){
        if(now->val >= q1) ans++;

        q1 = max(q1, now->val);
        if(now->right != nullptr) DFS(now->right, q1);
        if(now->left != nullptr) DFS(now->left, q1);
    }
};

https://ithelp.ithome.com.tw/upload/images/20260929/20184265NtnZDljuRX.png

題目解析: 在二元樹中找出一條最長的「交錯路徑」,也就是每走一步就必須改變前進方向(左右方向交替),回傳這條路徑最長可以連續走多遠
解題思路: 設變數ans記最長步數。寫一個DFS函數,傳入目前的行進方向、現在節點跟累積步數。遇到空節點就跳出,並隨時把ans更新成最大的步數。如果目前方向是設定為1,下一步往左就是斷掉重來(步數變1),往右則是順利交錯(步數加1);方向設定為2則相反。一開始從根節點把左右兩種起步方向都丟進去跑,最後回傳ans

class Solution {
public:
    int ans = 0;
    int longestZigZag(TreeNode* root) {
        DFS(1, root, 0);
        DFS(2, root, 0);

        return ans;
    }

    void DFS(int pos, TreeNode* now, int deep){
        if (!now) return;
        ans = max(ans, deep);

        if(pos == 1){
            DFS(1, now->left, 1);
            DFS(2, now->right, deep+1);
        }else{
            DFS(1, now->left, deep+1);
            DFS(2, now->right, 1);
        }
    }
};

上一篇
C++ 演算法練習 Day14|827, 104, 2130題解與思路分享
下一篇
C++ 演算法練習 Day16|198, 790, 62 題解與思路分享
系列文
30天刷完leetcoode75 共 17 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言