- 题目描述:
- 设计思想:
详细操作流程看下图:
-视频讲解链接B站视频讲解
- 代码:
c++版本:
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
class Solution {
public:
/**
*
* @param root TreeNode类
* @param sum int整型
* @return int整型vector<vector<>>
*/
vector<vector<int>>res; //返回最终结果
vector<int>tmp; //用于临时存储路径
void dfs(TreeNode* root,int sum,int cnt){
if(root == NULL) return; // 如果节点为空结束当前递归
tmp.push_back(root->val); //将当前节点加入tmp数组
cnt += root->val; //把当前节点加入到路径和中
if(root->left == NULL && root->right == NULL){ //当递归到没有子树的时候就需要判断
if(sum == cnt){ //如果当前节点的路径和等于sum,那么就在res中插入tmp
res.push_back(tmp);
}
}else{
dfs(root->left,sum,cnt); //递归左子树
dfs(root->right,sum,cnt); //递归右子树
}
cnt -= tmp[tmp.size()-1];
tmp.pop_back();
}
vector<vector<int> > pathSum(TreeNode* root, int sum) {
// write code here
dfs(root,sum,0); //开始类似先序的递归
return res;
}
};
Java版本:
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* }
*/
public class Solution {
/**
*
* @param root TreeNode类
* @param sum int整型
* @return int整型ArrayList<ArrayList<>>
*/
ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>(); //用于存储结果
ArrayList<Integer> temp = new ArrayList<Integer>(); //用于存储路径
public ArrayList<ArrayList<Integer>> pathSum (TreeNode root, int sum) {
dfs(root,sum,0);
return res;
}
public void dfs(TreeNode root, int sum,int cnt) {
if(root == null) return; // 如果节点为空结束当前递归
temp.add(root.val); //将当前节点加入tmp数组
cnt += root.val; //把当前节点加入到路径和中
if(root.left == null && root.right == null){ //当递归到没有子树的时候就需要判断
if(cnt == sum){ //如果当前节点的路径和等于sum,那么就在res中插入tmp
res.add(new ArrayList<>(temp));
}
}else{
dfs(root.left,sum,cnt); //递归左子树
dfs(root.right,sum,cnt); //递归右子树
}
cnt -= temp.get(temp.size()-1);
temp.remove(temp.size() - 1);
}
}
Python版本:
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
#
#
# @param root TreeNode类
# @param sum int整型
# @return int整型二维数组
#
class Solution:
def pathSum(self , root , sum ):
# write code here
temp,res=[],[]
def dfs(root,sum,cnt):
if not root: return #如果节点为空结束当前递归
temp.append(root.val) #将当前节点加入temp数组
cnt += root.val #把当前节点加入到路径和中
if root.left == None and root.right == None: #当递归到没有子树的时候就需要判断
if cnt == sum:res.append(temp[:]) #如果当前节点的路径和等于sum,那么就在res中插入tmp
else:
dfs(root.left,sum,cnt) #递归左子树
dfs(root.right,sum,cnt) #递归右子树
cnt -= temp[len(temp) - 1]
temp.pop()
dfs(root,sum,0)
return res

京公网安备 11010502036488号