这道题一看就是用DFS,但是无奈自己写不出,想不到怎么返回上一层,实际上当左和右都不存在的时候也就是遍历到叶子节点的时候自然会返回上一层了
下面这是我看了别人的解法后添加了自己的理解
/**
* 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 {
public:
bool check(TreeNode* t, int sum, int a) {
//每次return在不断改变 直到遍历到符合条件的叶子节点或者遍历完整棵树才退出
//调试
//int x=-1;
//if(t)x=t->val;
//cout<<"sum:"<<sum<<"root-val:"<<x<<endl;
//这个解法是当前节点为空就return
// if(t == NULL&&sum == a) return true;
if(t == NULL) return false;
//如果这个节点是叶子节点并且符合要求
if(!t->left&&!t->right&&sum+t->val == a) return true;
//两个节点中存在一个的情况 哪个存在就走哪个
if(t->left == NULL&&t->right != NULL) return check(t->right, sum+t->val, a);
if(t->left != NULL&&t->right == NULL) return check(t->left, sum+t->val, a);
//如果两个节点都存在 找左再找右 然后遍历完该条线的路径之后就会自动返回到上一层
bool L=check(t->left, sum+t->val, a);
bool R=check(t->right, sum+t->val, a);
return L||R;
}
bool hasPathSum(TreeNode* root, int sum) {
if(root == NULL) return false;
return DFS(root,0,sum);
// return check(root,0,sum);
// if(ans==sum) return true;
// return false;
}
};
然后下面是我的原始思路和改进后的代码
//最开始的想法
bool DFS(TreeNode* root,int sum,int target)
{
cout<<"sum:"<<sum<<endl;
//当前值相等
if(sum==target) return;
if(root==NULL) return;
其实不用考虑大小的情况
if(sum+root->val<target)
{
int tsum=sum+root->val;
if(root->left) return DFS(root->left,tsum,target);
else if(root->right) return DFS(root->right,tsum,target);
else return;
}
if(sum+root->val>target)
{
return;
}
}
bool DFS(TreeNode* root,int sum,int target)
{
cout<<"sum:"<<sum<<endl;
//当前值相等
if(sum==target) return true;
if(root==NULL) return false;
int tsum=sum+root->val;
//错误 仔细想想这两种写法会漏掉某些情况!
// if(root->left) return DFS(root->left,tsum,target);
// if(root->right) return DFS(root->right,tsum,target);
if(root->left&&!root->right) return DFS(root->left,tsum,target);
if(root->right&&!root->left) return DFS(root->right,tsum,target);
return DFS(root->left,tsum,target)||DFS(root->right,tsum,target);
}