66 lines
2.2 KiB
JavaScript
66 lines
2.2 KiB
JavaScript
/**
|
||
* Definition for a binary tree node.
|
||
* function TreeNode(val, left, right) {
|
||
* this.val = (val===undefined ? 0 : val)
|
||
* this.left = (left===undefined ? null : left)
|
||
* this.right = (right===undefined ? null : right)
|
||
* }
|
||
*/
|
||
/**
|
||
* @param {TreeNode} root
|
||
* @param {number} targetSum
|
||
* @return {boolean}
|
||
*/
|
||
const hasPathSum = function (root, targetSum) {
|
||
|
||
};
|
||
|
||
/*
|
||
思路:利用递归抽象问题,如果左节点或者右节点满足 targetSum - root.val,那么整个树就满足
|
||
*/
|
||
function f1(root, targetSum) {
|
||
if (!root) return false; // 如果当前节点为空,返回 false
|
||
|
||
// 如果当前节点是叶子节点,且值等于目标值,返回 true
|
||
if (!root.left && !root.right) return root.val === targetSum;
|
||
|
||
// 递归判断左子树或右子树是否存在满足条件的路径
|
||
const remainingSum = targetSum - root.val;
|
||
return hasPathSum(root.left, remainingSum) || hasPathSum(root.right, remainingSum);
|
||
}
|
||
|
||
/*
|
||
思路:利用层序遍历,获得从根节点到当前节点的所有和,只需准备两个队列,一个队列用于层序遍历,一个节点用于保存层序遍历到的
|
||
每一个值得路径综合,如果这个节点是一个叶子节点,就检查总和是不是和targetSum一致,如果不一致,继续检查其他得叶子节点
|
||
*/
|
||
function f2(root, targetSum) {
|
||
if (!root) return false; // 如果根节点为空直接返回false
|
||
|
||
const nodeQue = [root]; // 层序遍历的队列
|
||
const sumQue = [root.val]; // 遍历nodeQue的节点的路径总和,和nodeQue是同步的
|
||
|
||
while (nodeQue.length > 0) {
|
||
const node = nodeQue.shift();
|
||
const sum = sumQue.shift();
|
||
|
||
// 如果当前节点为叶子节点检查sum是否和targetSum相等
|
||
if (!node.left && !node.right && sum === targetSum) return true;
|
||
|
||
// 如果左右节点存在将左右节点存入队列,对应的路径和存入sum队列
|
||
if (node.left) {
|
||
nodeQue.push(node.left);
|
||
sumQue.push(sum + node.left.val);
|
||
}
|
||
|
||
if (node.right) {
|
||
nodeQue.push(node.right);
|
||
sumQue.push(sum + node.right.val);
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
|
||
/*
|
||
思路三:和f1是一样的,只不过利用dfs来代替递归,//TODO
|
||
*/
|