113. 路徑總和II

中等 深度優先搜索 回溯 二叉樹

思路

判斷二叉樹從根結點走到葉節點的所有路徑中,經過的節點數值總和是targetSum
把所有總和是targetSum的路徑記錄下來。


  • curPath代表當前的路徑
  • curSum代表當前路徑總和
  • 從根結點往下走,當走到葉節點時,假如當前總和是targetSum,代表找到一個路徑,加入到答案當中。

走到一個節點時,先將當前節點的資訊加入,遞迴呼叫之後要回傳,在回傳時,還原成一開始的樣子。
比如呼叫dfs(root->left)時,先將left節點的資訊加入到curPathcurSum當中。
判斷是否為葉節點,如果是,看現在的路徑總和目標。不是就繼續往下走。在下面的路徑都走過之後,
還原成一開始的樣子。這樣dfs(root)才不會因為dfs(root->left)的改動而出錯。

程式碼

dfs

class Solution {
public:
    vector<vector<int>> pathSum(TreeNode* root, int targetSum) {
        if(!root) return {};
        
        vector<vector<int>> res; // 最後答案
        vector<int> curPath;
        int curSum = 0;

        auto dfs = [&](this auto&&dfs, TreeNode* node) -> void {
            curPath.push_back(node->val);
            curSum += node->val;
            
            if(!node->left && !node->right) { // 走到葉節點,看總和是否為 targetSum
                if(curSum == targetSum) {
                    res.push_back(curPath);
                }
            }
            else {
                // 不是葉節點
                if(node->left) dfs(node->left); // 繼續往左走
                if(node->right) dfs(node->right); // 繼續往右走
            }

            curPath.pop_back();
            curSum -= node->val;
        };
        
        dfs(root);
        return res;
    }
};

複雜度分析

  • 時間複雜度:O(n)O(n)
  • 空間複雜度:O(n)O(n)

顯示設定

背景線條
顯示背景網格線條
懸停發光
滑鼠懸停時顯示霓虹效果
聚光燈
跟隨滑鼠的聚光燈效果
背景透明度
開啟透明玻璃效果
主題顏色
自訂主要顏色