题目描述
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。
叶子节点 是指没有子节点的节点。
输入输出
1 | 5 |
基本思路
方法一:广度优先搜索 时复$O(N)$空复$O(N)$
使用两个队列分别存储结点和结点路径和
方法二:递归时复$O(N)$空复$O(H)$ 其中
H
是树的高度。空间复杂度主要取决于递归时栈空间的开销,最坏情况下,树呈现链状,空间复杂度为
O(N)
。平均情况下树的高度与节点数的对数正相关,空间复杂度为O(log N)
。假定从根节点到当前节点的值之和为
val
,我们可以将这个大问题转化为一个小问题:是否存在从当前节点的子节点到叶子的路径,满足其路径和为sum - val
递归的性质:若当前节点就是叶子节点,那么我们直接判断
sum
是否等于val
即可(因为路径和已经确定,就是当前节点的值,我们只需要判断该路径和是否满足条件)。若当前节点不是叶子节点,我们只需要递归地询问它的子节点是否能满足条件即可。
java实现
1 | //方法二 |