路径总和
题目描述
给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。
说明: 叶子节点是指没有子节点的节点。
示例:
给定如下二叉树,以及目标和 sum = 22,
5
/ \
4 8
/ / \
11 13 4
/ \ \
7 2 1
返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2。
解题思路
这个题可以用递归,也可以用广度优先搜索。
代码
1.递归
/**
* 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 hasPathSum(TreeNode* root, int sum) {
if(root==nullptr)//root是否为空
return false;
if(root->right==nullptr&&root->left==nullptr)
//到达叶子节点
{
if(root->val==sum)
return true;
}
return hasPathSum(root->left,sum-root->val)||hasPathSum(root->right,sum-root->val);
//左子树和右子树
}
};
2.广度优先搜索
/**
* 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 hasPathSum(TreeNode* root, int sum) {
if(root==nullptr)//如果root为空指针,直接返回false
return false;
queue<int>que1;//用来保存节点的值得和
queue<TreeNode*>que2;//保存节点
int now1;//当前的和
TreeNode* now2;//当前节点
que1.push(root->val);//初始化队列
que2.push(root);
while(!que2.empty())
{
now1=que1.front();//当前和
que1.pop();//出队
now2=que2.front();//当前状态
que2.pop();//出队
if(now2->left==nullptr&&now2->right==nullptr)
//到达叶子节点
{
if(now1==sum)//和正好与sum相等
return true;//返回true
}
if(now2->left!=nullptr)//left不为空
{
que1.push(now1+now2->left->val);
//加上left的值入队
que2.push(now2->left);
//left入队
}
if(now2->right!=nullptr)//right不为空
{
que1.push(now1+now2->right->val);
//加上right入队
que2.push(now2->right);
//right入队
}
}
//队列已经空了还没找到,说明没有那种情况
return false;
}
};
本文探讨了二叉树中寻找从根节点到叶子节点的路径,使得路径上所有节点值之和等于给定目标和的问题。通过递归和广度优先搜索两种方法解析,提供了详细的代码实现。
1882

被折叠的 条评论
为什么被折叠?



