Given a binary tree and a sum, find all root-to-leaf paths where each path’s sum equals the given sum.
Note: A leaf is a node with no children.
Example:
Given the below binary tree and sum = 22,
5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
Return:
[
[5,4,11,2],
[5,8,4,5]
]
题目翻译:
给你一个二叉树和sum ,找到所有的从根节点到叶子节点的所有路径,让和等于给定的sum,
题目解析:
找到一个和为sum的根到叶子节点,因为要输出所有节点的数字,所以这个题用dp就不能行,因为dp只能求到有多少种方式让他等于sum ,所以这个题应该用回溯法,具体应该用dfs还是bfs呢,先用dfs试下:
具体思想步骤就应该是:
首先加入根节点,然后在开始dfs 但是要用到当前数字的和 temp_sum表示
temp_Sum<sum 继续遍历
temp_sum>sum 跳出不能走这一点
temp_sum == sum 并且在根节点的时候就可以继续遍历但是怎么看他是不是根节点呢可以根据他的下个节点存不存在来看,但是怎么看他的左右节点存不在呢,(这点有疑问先留着)
先写代码
vector<vector< int>> res(1000,vector());
vector<vector< int>>
res(1000, vector< int>(1000));
只能向二维vector里面添加一维的vector,(重点)
比如如果你定义一个二维的vector<vector< int >> result;
vector< int> temp;
result.push_back(temp);
/**
* 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 {
private:
vector< vector<int> > result ;
vector<int> temp;
public:
vector<vector<int>> pathSum(TreeNode* root, int sum) {
find(root , sum , 0 );
return result;
}
void find(TreeNode*root , int sum , int temp_sum )
{
if(root)
cout<<"当前的元素 root的值,和,在加之前的和,ij"<<root->val<<" "<<sum <<" "<<temp_sum<<" " <<endl;
cout<<"当前result的结果:"<<endl;
for(int i = 0;i<result.size();i++)
{
for(int j=0;j<result[0].size();j++)
{
cout<<result[i][j]<<" ";
}
}
cout<<endl;
cout<<"当前temp的结果:"<<endl<<"当前temp_sum的值: "<<temp_sum<<" ";
for(int i =0;i<temp.size();i++)
{
cout<<temp[i];
}
cout<<endl;
/* if(sum== temp_sum&&(root ==NULL) )//该怎么判断他是否有根呢 ,主要是在上一个节点就越界了,笨蛋
{
cout<<"sum==temp"<<endl;
result.push_back(temp);
temp.clear();
return ;
}*/
//这里是加入新元素的情况
//else if(root)
if(!root)//怎么加都加不到
{
// temp.pop_back();
cout<<"当前root为空跳出";
return;
}
else if(sum >temp_sum)
{
//可以加入元素:
cout<<"sum>temp"<<endl;
temp_sum +=root->val;
temp.push_back( root->val );
cout<<"sumand tempsum"<<sum<<" "<<temp_sum<<endl;
if(sum < temp_sum)
{
cout<<"sum<temp_sum"<<endl;
temp.pop_back();
return ;
}
else if(sum==temp_sum&&(root->left==NULL||root->right==NULL))
{
cout<<"sum==temp"<<endl;
result.push_back(temp);
temp.pop_back();
return ;
}
cout<<"当前temp_sum的值"<<" "<<temp_sum<<endl;
cout<<"进入左子树"<<endl;
find(root->left , sum ,temp_sum );
cout<<"进入右子树"<<endl;
find(root->right ,sum ,temp_sum );
temp.pop_back();
//temp_sum -=root->val;
}
}
};