力扣链接:112.路径总和
难度:⭐
✏️ 方法一:
解题关键词:二叉树
、递归
解题思路:使用递归一直往下判断是否存在叶子节点的值等于当前传入的 sum 值,如果有,那么就存在这样的叶子节点。
typescript
function hasPathSum(root: TreeNode | null, targetSum: number): boolean {
// 如果节点为空,直接返回 false
if (root === null) return false
// 如果当前节点是叶子节点,那么判断当前节点的值是否等于 targetSum
// 如果相等,说明存在这样一条路径
if (!root.left && !root.right) {
return targetSum == root.val
}
// 递归判断左子树
const left = hasPathSum(root.left, targetSum - root.val)
// 递归判断右子树
const right = hasPathSum(root.right, targetSum - root.val)
return left || right
};
✏️ 方法二:
解题关键词:二叉树
、层序遍历
解题思路:使用层序遍历往下走,用两个栈,一个栈保存节点,另一个栈保存对应位置节点的路径和,当到了叶子节点,当前节点的路径和已经等于 targetSum,那么就存在这样一条路径。
typescript
function hasPathSum(root: TreeNode | null, targetSum: number): boolean {
// 如果 root 为空,直接返回 false
if (root === null) return false
// 节点队列
const queue: TreeNode[] = [root]
// 每一条路径和
const pathsSum: number[] = [root.val]
while (queue.length) {
// 拿到当前要操作的节点
const target = queue.shift()
// 拿到从根节点到当前操作的节点的路径和
const targetValue = pathsSum.shift()
// 如果不是叶子节点,那么继续加和
if (target.left || target.right) {
if (target.left) {
queue.push(target.left)
pathsSum.push(targetValue + target.left.val)
}
if (target.right) {
queue.push(target.right)
pathsSum.push(targetValue + target.right.val)
}
} else if (targetValue === targetSum) { // 到了叶子节点,判断是否路径和等于 targetSum
return true
}
}
return false
};