题目:
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum ,判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum。
叶子节点 是指没有子节点的节点。
示例 1:
输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出:true
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/path-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路一:使用递归实现深度优先搜索
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
bool hasPathSum(struct TreeNode* root, int targetSum){
if(root == NULL)
return false;
int sum = targetSum - root->val;
if(root->left == NULL && root->right == NULL)
{
if(sum == 0)
return true;
else
return false;
}
return hasPathSum(root->left,sum) || hasPathSum(root->right,sum);
}
分析:
注意返回值语句return hasPathSum(root->left,sum) || hasPathSum(root->right,sum);
用到了逻辑或’||'运算,保证了返回值的唯一性。
思路二:广度优先遍历
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
typedef struct queNode
{
int val;
struct TreeNode* node;
struct queNode* next;
}queNode;
void addNodeToQue(queNode** p,int val, struct TreeNode* node)
{
*p = (queNode*)malloc(sizeof(queNode));
(*p)->val = val;
(*p)->node = node;
(*p)->next = NULL;
}
bool hasPathSum(struct TreeNode* root, int targetSum){
if(root == NULL)
return false;
queNode* addNode;
queNode* delNode;
addNodeToQue(&addNode,root->val,root);
delNode = addNode;
while(delNode != NULL)
{
struct TreeNode* now = delNode->node;
int temp = delNode->val;
if(now->left == NULL && now->right == NULL)
{
if(temp == targetSum)
return true;
}
if(now->left != NULL)
{
addNodeToQue(&addNode->next,temp + now->left->val,now->left);
addNode = addNode->next;
}
if(now->right != NULL)
{
addNodeToQue(&addNode->next,temp + now->right->val,now->right);
addNode = addNode->next;
}
delNode = delNode->next;
}
return false;
}
分析:
1.新建了一个queNode的结构体,里面保存树的节点以及该节点的总和值。
2.使用两个指针管理队列,一个用在加节点,一个用来取节点
queNode* addNode;
queNode* delNode;
addNodeToQue(&addNode,root->val,root);
delNode = addNode;
3.addNodeToQue()用来给队列的下一个地址增加节点和计算总和值
总结;
队列:广度优先搜索
栈:深度优先搜索