1、题目描述
给出一个二叉树和一个target,判断有没有一条从根节点到叶子节点的路径,使得路径上的节点数值之和等于target。
2、思路
BFS:每次放入queue的都是从根节点到当前节点的节点数值之和。如果当前有左右节点,则将其分别加上左右节点数值,
放入queue,若当前节点是叶子节点,则判断当前和是否是target。
DFS:初始值sum为root->val,先加上左边节点的值,一直往左深入,到头了,不是target,再减掉最后一个加上的值,再往右遍历。
3、代码
BFS:
bool hasPathSum(TreeNode* root, int sum) {
if(root==NULL)
return false;
queue<TreeNode*>q;
q.push(root);
while(!q.empty()){
TreeNode* t=q.front();
q.pop();
if(t->left==NULL&&t->right==NULL&&t->val==sum)
return true;
if(t->left){
t->left->val += (t->val);
q.push(t->left);
}
if(t->right){
t->right->val += (t->val);
q.push(t->right);
}
}
return false;
}
DFS:
bool hasPathSum(TreeNode* root, int sum) {
if(!root)
return false;
return dfs(root,sum,0);
}
bool dfs(TreeNode* root, int sum,int s){
if(root==NULL){
if(s==sum) return true;
else return false;
}
if(!root->left)
return dfs(root->right,sum,s+root->val);
else if(!root->right)
return dfs(root->left,sum,s+root->val);
else
return dfs(root->left,sum,s+root->val)||dfs(root->right,sum,s+root->val);
}