题目:
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。
叶子节点 是指没有子节点的节点。
C++:
DFS解答:
用result记录结果,找到叶子节点后,判断总和与目标相等与否,若相等则把result改为true。
#include<iostream>
using namespace std;
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode()
{
left = right = nullptr;
}
TreeNode(int x)
{
val = x;
left = right = nullptr;
}
TreeNode(int x, TreeNode *left, TreeNode *right)
{
val = x;
left = left; right = right;
}
};
class Solution
{
public:
bool hasPathSum(TreeNode* root, int targetSum)
{
if (root == nullptr) return false;
bool result = false;
dfs(root, targetSum, 0, result);
}
void dfs(TreeNode* root, int targetSum, int sum, bool&result)
{
// 记录目前总和
sum += root->val;
if (root->left == nullptr && root->right == nullptr)
{
if (sum == targetSum)
{
result = true;
}
return;
}
if (root->left != nullptr)
{
dfs(root->left, targetSum, sum, result);
}
if (root->right != nullptr)
{
dfs(root->right, targetSum, sum, result);
}
}
};
Python:
思路:dfs(深度优先)
这道题我们要找到从根节点到叶子节点的路径和满足目标值的路径。而深度优先搜索就是在走每一条根节点到叶子节点的路径。我们只要在遍历的同时,维护路径和,当到达叶子节点时在判断即可。
由于我们需要在叶子节点的地方进行路径和的校验。因此在深度优先搜索的过程中,我们要对当前节点是否为叶子节点进行判断,再进行后续搜索。
class TreeNode:
def __init__(self,val=0,left=None,right=None):
self.val = val
self.right = right
self.left = left
class Solution:
def hasPathSum(self, root, targetSum):
def dfs(node, val_sum):
val_sum += node.val # 累加当前节点值
if not node.left and not node.right:
return val_sum == targetSum # 当前节点为叶子节点,判断路径和是否等于目标值
if node.left and dfs(node.left, val_sum): return True # 当前节点左子节点存在且其左子树中存在满足目标的路径和,返回true
if node.right: return dfs(node.right,val_sum) # 当前节点右子节点,返回其右子树的搜索结果
return False # 没有满足条件的路径和,返回false
return dfs(root, 0) if root else False # 根节点为空直接返回false,否则从根节点开始搜索