【12】 路徑總和(LeetCode 112、113)
阿新 • • 發佈:2021-01-06
技術標籤:LeetCode刷題筆記二叉樹演算法資料結構leetcodec++
問題描述
路徑總和 I
給定一個二叉樹和一個目標和,判斷該樹中是否存在根節點到葉子節點的路徑,這條路徑上所有節點值相加等於目標和。
說明: 葉子節點是指沒有子節點的節點。
解題思路
自頂向下依次遍歷節點的值,每遍歷到一層,就將sum減去相應節點的值,直到遍歷到葉子節點,判斷此時葉子結點的值是否剛好等於sum的值,若是則返回true,否則返回false。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool hasPathSum(TreeNode* root, int sum) {
if(root==NULL)
return false;
if(root->left==NULL&&root->right==NULL)//葉子節點
return sum==root->val;
return hasPathSum(root->left,sum-root->val)||hasPathSum(root- >right,sum-root->val);
}
};
路徑總和 II
給定一個二叉樹和一個目標和,找到所有從根節點到葉子節點路徑總和等於給定目標和的路徑。
說明: 葉子節點是指沒有子節點的節點。
解題思路
解題思路其實和路徑總和 I 差不多,就是多了一個需要記錄路徑,因此可以使用回溯法,一層層遍歷。
注意:遍歷每個節點時將節點值加入到路徑中,而返回時要記得將節點值從路徑中移除。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> res;//儲存結果
vector<int> temp;//儲存路徑
void Result(TreeNode* root, int sum){
if(root==NULL)
return ;
if(root->left==NULL&&root->right==NULL){ //若為葉子節點
if(sum==root->val){ //若為有效路徑
temp.push_back(root->val);
res.push_back(temp); //則輸出結果
temp.pop_back();
}
return ;
}
if(root->left!=NULL){ //左子樹不為空
temp.push_back(root->val); //則將當前節點的值加入路徑
Result(root->left,sum-root->val); //繼續深度遍歷
temp.pop_back(); //遍歷完記得將當前節點從路徑中移除
}
if(root->right!=NULL){//右子樹不為空時同理
temp.push_back(root->val);
Result(root->right,sum-root->val);
temp.pop_back();
}
}
vector<vector<int>> pathSum(TreeNode* root, int sum) {
Result(root,sum);
return res;
}
};