112. 路径总和
代码
DFS
var hasPathSum = function(root, targetSum) {
//找到没有根了,那么就说明这条路行不通
if(!root){
return false;
}
//既没有左节点,也没有右节点,则是叶子节点
if(!root.left && !root.right){
return root.val === targetSum;
}
//递归
return hasPathSum(root.left,targetSum-root.val) || hasPathSum(root.right,targetSum-root.val)
};
复杂度分析:
- 时间复杂度:\(O(N)\),N是节点数
- 空间复杂度:\(O(T)\),T是树节点的高度
BFS
队列1则保存节点
队列2用来存放节点到根节点的路径和
var hasPathSum = function(root, targetSum) {
//过了叶子节点的情况,就是找不到符合的路径
if(root == null){
return false;
}
var queue1 = [root];
var queue2 = [root.val];
//当有节点可以继续拿来用时
while(queue1.length !== 0){
//出队列
var node = queue1.shift();
var rootVal=queue2.shift();
//找到叶子节点,并且也符合目标值的情况
if(node.left == null && node.right == null && rootVal == targetSum){
return true;
}
//继续遍历左节点
if(node.left){
//记录往了左节点
queue1.push(node.left);
//记录走了后的值为多少
queue2.push(node.left.val+rootVal);
}
//继续遍历右节点
if(node.right){
queue1.push(node.right);
queue2.push(node.right.val+rootVal);
}
}
return false;
};
复杂度分析:
- 时间复杂度:\(O(N)\),N是节点数
- 空间复杂度:\(O(N)\),N是树节点的节点数