Leecode---112:路径总和(是否存在和为target路径)

题目
给你二叉树的根节点 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,否则从根节点开始搜索
  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ghx3110

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值