iT邦幫忙

2026 iThome 鐵人賽

DAY 14
0
Software Development

30天刷完leetcoode75系列 第 14 篇

C++ 演算法練習 Day14|827, 104, 2130題解與思路分享

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20260928/201842658hPuxhJvwN.png

題目解析: 給定兩棵二元樹,判斷從左到右所有的葉子節點數值排出來是不是一模一樣
解題思路: 設一個佇列v裝第一棵樹的葉子,寫一個DFS函數跑第一棵樹,遇到葉子就塞進v。再寫一個solve函數跑第二棵樹,遇到葉子就跟v最前面的比對,不一樣就標記錯誤,一樣就把v最前面拔掉。最後回傳結果狀態

class Solution {
public:
    bool check = true;
    queue v;

    bool leafSimilar(TreeNode* root1, TreeNode* root2) {
        DFS(root1);
        solve(root2);
        return check && v.empty();
    }

    void DFS(TreeNode* now) {
        if (now->left == nullptr && now->right == nullptr) {
            v.push(now->val);
            return;
        }
        if (now->left != nullptr) DFS(now->left);
        if (now->right != nullptr) DFS(now->right);
    }

    void solve(TreeNode* now) {
        if (!check) return;
        if (now->left == nullptr && now->right == nullptr) {
            if (v.empty() || v.front() != now->val) {
                check = false;
            } else {
                v.pop();
            }
            return;
        }
        if (now->left != nullptr) solve(now->left);
        if (now->right != nullptr) solve(now->right);
    }
};

https://ithelp.ithome.com.tw/upload/images/20260928/20184265lft84jarUw.png

題目解析: 找出一棵二元樹的最大深度,也就是從根節點走到最遠葉子節點的長度
解題思路: 設變數ans記最大深度。根節點不為空就丟進DFS遞迴,初始深度設為1。每次往下跑就把ans更新為最大的深度,並往左右節點繼續遞迴且深度加1,最後回傳ans

class Solution {
public:
    int ans = 0;
    int maxDepth(TreeNode* root) {
        if(root != nullptr){
            DFS(root, 1);
        }

        return ans;
    }

    void DFS(TreeNode* now, int q){
        ans = max(ans, q);
        if(now->left != nullptr){
            DFS(now->left, q+1);
        }
        if(now->right != nullptr){
            DFS(now->right, q+1);
        }
    }
};

https://ithelp.ithome.com.tw/upload/images/20260928/20184265nyyR3ILxzX.png

題目解析: 給定偶數長度的鏈結串列,頭尾對稱位置的節點互相配對,找出加起來最大的配對總和
解題思路: 設一個陣列v,丟進迴圈把鏈結串列每個節點的數值都塞進去。接著再跑一個迴圈,把陣列頭尾對稱位子的數字相加,不斷把最大值更新給ans,最後回傳ans

class Solution {
public:
    int pairSum(ListNode* head) {
        int ans = 0;

        vector v;
        ListNode* p = head;

        while(p != nullptr){
            v.push_back(p->val);
            p = p->next;
        }

        for(int i=0; i<v.size(); i++){
            ans = max(ans, v[i]+v[v.size()-1-i]);
        }

        return ans;
    }
};

上一篇
C++ 演算法練習 Day13|2095, 328, 206 題解與思路分享
下一篇
C++ 演算法練習 Day15|1448, 1372 題解與思路分享
系列文
30天刷完leetcoode75 共 17 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言