醫(yī)院網(wǎng)站建設(shè)預(yù)算注冊公司
? 劍指 Offer 34. 二叉樹中和為某一值的路徑
難度:中等
給你二叉樹的根節(jié)點(diǎn) root
和一個整數(shù)目標(biāo)和 targetSum
,找出所有 從根節(jié)點(diǎn)到葉子節(jié)點(diǎn) 路徑總和等于給定目標(biāo)和的路徑。
葉子節(jié)點(diǎn) 是指沒有子節(jié)點(diǎn)的節(jié)點(diǎn)。
示例 1:
輸入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
輸出:[[5,4,11,2],[5,8,4,5]]
示例 2:
輸入:root = [1,2,3], targetSum = 5
輸出:[]
示例 3:
輸入:root = [1,2], targetSum = 0
輸出:[]
提示:
- 樹中節(jié)點(diǎn)總數(shù)在范圍
[0, 5000]
內(nèi) -1000 <= Node.val <= 1000
-1000 <= targetSum <= 1000
注意:本題與 113. 路徑總和 II 相同。
💡思路:dfs
深度優(yōu)先搜索的方式,枚舉每一條從根節(jié)點(diǎn)到葉子節(jié)點(diǎn)的路徑。
- 當(dāng)我們遍歷到葉子節(jié)點(diǎn),且此時(shí)路徑和恰為目標(biāo)和時(shí),我們就找到了一條滿足條件的路徑,將 數(shù)組
tmp
加入ans
。 - 返回時(shí),要刪除當(dāng)前數(shù)組
tmp
最后一個元素。
🍁代碼:(C++、Java)
C++
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
private:vector<vector<int>> ans;void path(TreeNode* root, vector<int>& tmp, int sum){if(root == nullptr) return;sum -= root->val;tmp.push_back(root->val);if(sum == 0 && root->left == nullptr && root->right == nullptr) {ans.push_back(tmp);}else{path(root->left, tmp, sum);path(root->right, tmp, sum);}tmp.pop_back();return;}
public:vector<vector<int>> pathSum(TreeNode* root, int target) {vector<int> tmp;path(root, tmp, target);return ans;}
};
Java
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val = val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/
class Solution {private List<List<Integer>> ans = new LinkedList<List<Integer>>();private void path(TreeNode root, List<Integer> tmp, int sum){if(root == null) return;sum -= root.val;tmp.add(root.val);if(sum == 0 && root.left == null && root.right == null) {ans.add(new LinkedList(tmp));}else{path(root.left, tmp, sum);path(root.right, tmp, sum);}tmp.remove(tmp.size() - 1);return;}public List<List<Integer>> pathSum(TreeNode root, int target) {List<Integer> tmp = new LinkedList<>();path(root, tmp, target);return ans;}
}
🚀 運(yùn)行結(jié)果:
🕔 復(fù)雜度分析:
- 時(shí)間復(fù)雜度: O ( n 2 ) O(n^2) O(n2),其中
n
為樹的節(jié)點(diǎn)數(shù)。在最壞情況下,樹的上半部分為鏈狀,下半部分為完全二叉樹,并且從根節(jié)點(diǎn)到每一個葉子節(jié)點(diǎn)的路徑都符合題目要求。此時(shí),路徑的數(shù)目為 O ( n ) O(n) O(n),并且每一條路徑的節(jié)點(diǎn)個數(shù)也為 O ( n ) O(n) O(n),因此要將這些路徑全部添加進(jìn)答案中,時(shí)間復(fù)雜度為 O ( n 2 ) O(n^2) O(n2)。 - 空間復(fù)雜度: O ( n ) O(n) O(n),空間復(fù)雜度主要取決于棧空間的開銷,棧中的元素個數(shù)不會超過樹的節(jié)點(diǎn)數(shù)。
題目來源:力扣。
放棄一件事很容易,每天能堅(jiān)持一件事一定很酷,一起每日一題吧!
關(guān)注我LeetCode主頁 / CSDN—力扣專欄,每日更新!