112.路径总和
给你二叉树的根节点 root
和一个表示目标和的整数 targetSum
。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum
。如果存在,返回 true
;否则,返回 false
。
叶子节点 是指没有子节点的节点。
示例 1:
输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22 输出:true 解释:等于目标和的根节点到叶节点路径如上图所示。
思路详解:本题仍然使用递归方法求解,想要知道有没有值符合要求我们可以一直计算targetsum-root->val 最后到根节点如果等于0说明有符合要求的路径,否则没有。
代码详解:
class Solution {
public:bool hasPathSum(TreeNode* root, int targetSum) {if(root==nullptr)//如果根节点为空直接返回false{return false;}if(root->left==nullptr&&root->right==nullptr)//如果只有根节点那么判断以下根节点和目标值是否相同{return root->val==targetSum;}return hasPathSum(root->left,targetSum-root->val)||hasPathSum(root->right,targetSum-root->val);//顺次递归逐层判断是否有值能满足目标值减去当前值}
};
面经:
- 什么是c++中的常量表达式,有什么作用,如何判断是不是常量表达式
常量表达式是指在编译时就能确定其值的表达式。这样的表达式可以用于需要常量值的上下文中,例如数组的大小、枚举值、位域的大小以及非类型模板参数等。
下面是一些常量表达式
5 // 整数字面量
3.14 // 浮点数字面量
'a' // 字符字面量
"Hello" // 字符串字面量(注意:字符串字面量在C++中不是常量表达式,因为它是一个指针常量,指向字符数组)
true // 布尔字面量
nullptr // 空指针字面量
1 + 2 // 使用运算符的表达式,只要操作数都是常量表达式
enum {size = 10}; size // 枚举值
常量表达式有以下作用:
- 定义数组的容量:在C++中,数组的容量必须是一个常量表达式。例如,int array[10]; 中的 10 就是一个常量表达式。
- 指定枚举值:枚举类型的值可以在定义时使用常量表达式来初始化。
- 模板的非类型参数:模板的非类型参数必须是一个常量表达式。例如,template<int N> class Array {...}; 中的 N 必须是一个常量表达式。
- case语句中的标签:在switch语句中,case标签必须是一个常量表达式。
- 位域的大小:在结构体或联合体中定义位域时,位域的大小必须是一个常量表达式。
- 静态断言:C++11引入的静态断言 static_assert 的第二个参数必须是一个常量表达式。
判断一个表达式是否是常量表达式,可以遵循以下准则:
- 字面量:所有的字面量(如数字、字符、字符串字面量)都是常量表达式。
- 枚举常量:枚举类型的常量也是常量表达式。
- const变量:如果 const 变量的值在编译时就能确定,并且它的类型是基本数据类型或枚举类型,那么它就是一个常量表达式。
- 运算符:如果运算符的操作数都是常量表达式,那么该运算符的结果也是常量表达式。