1. 程式人生 > 其它 >【12】 路徑總和(LeetCode 112、113)

【12】 路徑總和(LeetCode 112、113)

技術標籤: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; } };