题目描述:
给定一个二叉树和一个值sum,判断是否有从根节点到叶子节点的节点值之和等于sum的路径,
例如:
给出如下的二叉树,sum=22
返回true,因为存在一条路径5->4->11->2的节点值之和为22
方法一:
算法思想:通过二叉树前序遍历算法思想
重点在于:sum-root->val;表明当前结点val与sum之间的差值
若sum-root->val==0 表明存在和值为sum的分支
否则,在该结点的左右子树中继续寻找
hasPathSum(root->left,sum-root->val)||hasPathSum(root->right,sum-root->val)
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool hasPathSum(TreeNode *root, int sum) {
if(root==NULL) //空树,返回false
return false;
if(root->left==NULL&&root->right==NULL&&sum-root->val==0) //root为叶子结点且和为sum
return true; //返回true
//左右子树满足其一
return hasPathSum(root->left,sum-root->val)||hasPathSum(root->right,sum-root->val);
}
};
方法二:
算法思想:
通过队列queue_sum保存从根结点到当前结点的和值
通过队列queue_tree进行结点的遍历
当cur->left==NULL&&cur->right==NULL&&ret==sum时,返回true
否则,若当前结点存在左子树,入队;若当前结点存在右子树,入队
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool hasPathSum(TreeNode *root, int sum) {
if(root==NULL)
return false;
queue<TreeNode*> queue_tree; //树结点队列
queue<int> queue_sum; //和队列
queue_tree.push(root);
queue_sum.push(root->val);
while(!queue_tree.empty()) //树结点队列不为空
{
TreeNode *cur=queue_tree.front(); //队首结点
queue_tree.pop(); //出队
int ret=queue_sum.front(); //当前sum值
queue_sum.pop(); //出队
if(cur->left==NULL&&cur->right==NULL&&ret==sum) //满足条件
return true;
if(cur->left) //存在左子树
{
queue_tree.push(cur->left);
queue_sum.push(ret+cur->left->val);
}
if(cur->right) //存在右子树
{
queue_tree.push(cur->right);
queue_sum.push(ret+cur->right->val);
}
}
return false;
}
};