题目链接:
二叉树中和为某一值的路径(一)_牛客题霸_牛客网 (nowcoder.com)
题目简介:
描述
给定一个二叉树root和一个值 sum ,判断是否有从根节点到叶子节点的节点值之和等于 sum 的路径。
1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点
2.叶子节点是指没有子节点的节点
3.路径只能从父节点到子节点,不能从子节点到父节点
4.总节点数目为n
例如:
给出如下的二叉树, sum=22,
返回true,因为存在一条路径 5→4→11→2 的节点值之和为 22数据范围:
1.树上的节点数满足 0≤n≤10000
2.每 个节点的值都满足 ∣val∣≤1000
要求:空间复杂度 O(n),时间复杂度 O(n)
进阶:空间复杂度 O(树的高度),时间复杂度 O(n)
题目解法:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
/*BM29 二叉树中和为某一值的路径(一)
*描述
给定一个二叉树root和一个值 sum ,判断是否有从根节点到叶子节点的节点值之和等于 sum 的路径。
1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点
2.叶子节点是指没有子节点的节点
3.路径只能从父节点到子节点,不能从子节点到父节点
4.总节点数目为n
数据范围:
1.树上的节点数满足 0≤n≤10000
2.每 个节点的值都满足 ∣val∣≤1000
要求:空间复杂度 O(n) ,时间复杂度 O(n)
进阶:空间复杂度 O(树的高度) ,时间复杂度 O(n)
*/
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @param sum int整型
* @return bool布尔型
*/
bool recursion(struct TreeNode* node, int target){
static int sum = 0;
int lastNode;
if(!node)return false; //根节点为空
sum += node->val; //将当前节点的值加入sum
// if(sum > target)return false; //bug:节点有负数,因此不能判断当前值大于目标值就退出
if(sum == target && !node->left && !node->right)return true; //到达叶子节点并且当前值与目标值相等,返回true
if(node->left){ //如果左子节点存在,进行递归
if(true == recursion(node->left, target)) return true; //如果递归返回true,则继续返回true,直到最上层跳出函数
sum -= node->left->val; //运行到这里表示上一次递归返回了,需要减去上一次递归的node节点的值
}
if(node->right){
if(true == recursion(node->right, target)) return true;
sum -= node->right->val;
}
return false; //运行到这里,说明当前node左右子节点的路径都不满足返回false,跳回当前节点的父节点。(如果到根节点则退出函数返回false)
}
bool hasPathSum(struct TreeNode* root, int sum ) {
// write code here
return recursion(root, sum); //输入根节点与目标值进行递归
}
/**************************end******************************************/
int main ()
{
int returnSize = 0;
int* returnColumnSizes;
struct TreeNode n11 ={.val =-2 , .left = NULL, .right = NULL};
struct TreeNode n2 ={.val =8 , .left = NULL, .right = NULL};
struct TreeNode n1 ={.val =2 , .left = &n11, .right = NULL};
struct TreeNode root ={.val =0 , .left = &n1, .right = &n2};
// struct TreeNode n22 ={.val =9 , .left = NULL, .right = NULL};
// struct TreeNode n2 ={.val =8 , .left = NULL, .right = &n22};
// struct TreeNode n122 ={.val =7 , .left = NULL, .right = NULL};
// struct TreeNode n121 ={.val =2 , .left = NULL, .right = NULL};
// struct TreeNode n12 ={.val =11 , .left = &n121, .right = &n122};
// struct TreeNode n11 ={.val =1 , .left = NULL, .right = NULL};
// struct TreeNode n1 ={.val =4 , .left = &n11, .right = &n12};
// struct TreeNode root ={.val =5 , .left = &n1, .right = &n2};
int ret = hasPathSum(&root, 0);
printf("%d\t", ret);
return 0;
}