# DFS与回溯专题：路径总和问题

59 篇文章 1 订阅

## DFS与回溯专题：路径总和问题

### 一、路径总和

#### 代码纯享版

class Solution {

public int judge = 0;

public boolean hasPathSum(TreeNode root, int targetSum) {
int sum = 0;
dfs(root, targetSum, sum);
return judge == 1;
}

void dfs(TreeNode root, int targetSum, int sum){

if(root == null) return;

sum += root.val;

if(root.left == null && root.right == null){
if(sum == targetSum) judge = 1;
return;
}

dfs(root.left, targetSum, sum);
dfs(root.right, targetSum, sum);

}
}


#### 代码逐行解析版

class Solution {

public int judge = 0; //用于判断是否存在符合题目要求的路径

public boolean hasPathSum(TreeNode root, int targetSum) {
int sum = 0; //用来统计路径上的节点值
dfs(root, targetSum, sum); //对二叉树进行dfs搜索
return judge == 1; //如果judge等于1，返回true；否则返回false
}

void dfs(TreeNode root, int targetSum, int sum){

if(root == null) return; //节点为空，直接返回

sum += root.val; //将该节点的值加入sum中

if(root.left == null && root.right == null){ //该节点的左右子节点都为空时，说明搜索到了一条完整的路径
if(sum == targetSum) judge = 1; //如果sum与目标和相等，judge变成1
return;
}

//到这一步说明路径还没搜索完，接下来搜索该节点的左右子节点
dfs(root.left, targetSum, sum);
dfs(root.right, targetSum, sum);

}
}


### #代码纯享版

class Solution {

public List<List<Integer>> list_all = new ArrayList();
public List<Integer> list = new  ArrayList();

public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
int sum = 0;
dfs(root, targetSum, sum);
return list_all;
}

void dfs(TreeNode root, int targetSum, int sum){
if(root == null){
return;
}

sum += root.val;

if(root.left == null && root.right == null && sum == targetSum){
}

dfs(root.left, targetSum, sum);
dfs(root.right, targetSum, sum);

list.remove(list.size() - 1);
}
}


#### 代码逐行解析版

class Solution {

public List<List<Integer>> list_all = new ArrayList(); //记录所有符合条件的路径
public List<Integer> list = new  ArrayList(); //记录搜索过程中的路径

public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
int sum = 0; //用来统计路径上的节点值
dfs(root, targetSum, sum); //对二叉树进行dfs搜索
return list_all; //返回路径的列表
}

void dfs(TreeNode root, int targetSum, int sum){
if(root == null){ //节点为空，直接返回
return;
}

sum += root.val; //将该节点的值加入sum中

if(root.left == null && root.right == null && sum == targetSum){ //如果路径走完且与目标值相同
}

//到这一步说明路径还没搜索完，接下来搜索该节点的左右子节点
dfs(root.left, targetSum, sum);
dfs(root.right, targetSum, sum);

//删掉路径列表中最后一个节点
list.remove(list.size() - 1);
}
}


• 22
点赞
• 20
收藏
觉得还不错? 一键收藏
• 0
评论
04-03
12-29
04-07 5088
05-21 401
05-20 995
05-22 628
05-21 405
05-22 1028
05-22 234
05-21 532
05-22 323

### “相关推荐”对你有帮助么？

• 非常没帮助
• 没帮助
• 一般
• 有帮助
• 非常有帮助

1.余额是钱包充值的虚拟货币，按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载，可以购买VIP、付费专栏及课程。