? 劍指 Offer 34. 二叉樹中和為某一值的路徑
難度:中等
給你二叉樹的根節(jié)點 root
和一個整數(shù)目標(biāo)和 targetSum
,找出所有 從根節(jié)點到葉子節(jié)點 路徑總和等于給定目標(biāo)和的路徑。
葉子節(jié)點 是指沒有子節(jié)點的節(jié)點。
示例 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é)點總數(shù)在范圍
[0, 5000]
內(nèi) -1000 <= Node.val <= 1000
-1000 <= targetSum <= 1000
注意:本題與 113. 路徑總和 II 相同。
??思路:dfs
深度優(yōu)先搜索的方式,枚舉每一條從根節(jié)點到葉子節(jié)點的路徑。
- 當(dāng)我們遍歷到葉子節(jié)點,且此時路徑和恰為目標(biāo)和時,我們就找到了一條滿足條件的路徑,將 數(shù)組
tmp
加入ans
。 - 返回時,要刪除當(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;
}
}
?? 運行結(jié)果:
?? 復(fù)雜度分析:
-
時間復(fù)雜度:
O
(
n
2
)
O(n^2)
O(n2),其中
n
為樹的節(jié)點數(shù)。在最壞情況下,樹的上半部分為鏈狀,下半部分為完全二叉樹,并且從根節(jié)點到每一個葉子節(jié)點的路徑都符合題目要求。此時,路徑的數(shù)目為 O ( n ) O(n) O(n),并且每一條路徑的節(jié)點個數(shù)也為 O ( n ) O(n) O(n),因此要將這些路徑全部添加進答案中,時間復(fù)雜度為 O ( n 2 ) O(n^2) O(n2)。 - 空間復(fù)雜度: O ( n ) O(n) O(n),空間復(fù)雜度主要取決于棧空間的開銷,棧中的元素個數(shù)不會超過樹的節(jié)點數(shù)。
題目來源:力扣。文章來源:http://www.zghlxwxcb.cn/news/detail-637825.html
放棄一件事很容易,每天能堅持一件事一定很酷,一起每日一題吧!
關(guān)注我LeetCode主頁 / CSDN—力扣專欄,每日更新!文章來源地址http://www.zghlxwxcb.cn/news/detail-637825.html
注: 如有不足,歡迎指正!
到了這里,關(guān)于(樹) 劍指 Offer 34. 二叉樹中和為某一值的路徑 ——【Leetcode每日一題】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!