iT邦幫忙

2026 iThome 鐵人賽

DAY 24
0
Software Development

30天刷完leetcoode75系列 第 24 篇

C++ 演算法練習 Day24|1161, 236, 199 題解與思路分享

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20261008/20184265nKwvoEoP8u.png

題目解析:給定一棵二元樹,計算每一層節點的數值總和,找出總和最大的是在第幾層(層數從 1 開始算)
解題思路:設一個陣列 v 來記錄每一層的總和。寫一個 DFS 遞迴函數並傳入目前深度,若深度等於陣列大小,代表是首次到達該層,直接把節點值塞入陣列;否則就把節點值加進該層現有的總和中。等整棵樹遍歷完,再跑一次迴圈找出陣列中的最大值,回傳對應的索引加 1 即可

class Solution {
public:
    vector<int> v;
    int maxLevelSum(TreeNode* root) {
        int ans = 0, Max = INT_MIN;
        solve(root, 0);

        for(int i=0; i<v.size(); i++){
            if (v[i] > Max) {
                Max = v[i];
                ans = i;
            }
        }

        return ans+1;
    }

    void solve(TreeNode* now, int d) {
        if (!now) return ;
        else if (d == v.size()) {
            v.push_back(now->val);
        }else {
            v[d] += now->val;
        }

        solve(now->right, d+1);
        solve(now->left, d+1);
    }
};

https://ithelp.ithome.com.tw/upload/images/20261008/20184265NZ31CGSXKt.png

題目解析:給定一棵二元樹和兩個目標節點 p 與 q,找出這兩個節點的「最近共同祖先」
解題思路:利用 DFS 遞迴往下找。如果目前節點是空值,或是剛好等於 p 或 q,就直接回傳該節點。接著分別往左右子樹遞迴搜尋,如果左右兩邊都回傳找到了目標,代表 p 和 q 一左一右,目前的節點就是最近共同祖先;如果只有一邊找到,就把找到的那邊一路往上回傳

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if (!root || root == p || root == q) return root;

        TreeNode* left  = lowestCommonAncestor(root->left,  p, q);
        TreeNode* right = lowestCommonAncestor(root->right, p, q);

        if (left && right) return root;
        return left ? left : right;
    }
};

https://ithelp.ithome.com.tw/upload/images/20261008/20184265wXKNUHxwQ1.png

題目解析:想像站在一棵二元樹的右側看過去,從上到下把你肉眼能看見的節點數值記錄下來並回傳
解題思路:同樣設一個陣列 v 裝答案,並利用 DFS 帶入深度遞迴。關鍵在於這份程式碼的遞迴是「先走左邊、再走右邊」。如果深度剛好等於陣列大小就新增數值,否則就直接覆蓋掉該深度的舊數值。因為右子樹永遠比左子樹晚遍歷到,所以每一層最後留下來的數字,必定是該層最右側的節點值

class Solution {
public:
    vector<int> v;
    vector<int> rightSideView(TreeNode* root) {
        solve(0, root);

        return v;
    }

    void solve(int d,TreeNode* now) {
        if (!now) return ;
        else if (d == v.size()){
            v.push_back(now->val);
        }else{
            v[d] = now->val;
        }
        solve(d+1, now->left);
        solve(d+1, now->right);
    }
};

上一篇
C++ 演算法練習 Day23|994, 2462, 1318 題解與思路分享
系列文
30天刷完leetcoode75 共 24 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言