C++ 判断二叉树的路径总和 [LeetCode 112]
题目:
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum ,判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。 叶子节点 是指没有子节点的节点。 输入顺序为层次遍历 示例 1: 输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22 输出:true 示例 2: 输入:root = [1,2,3], targetSum = 5 输出:false 示例 3: 输入:root = [1,2], targetSum = 0 输出:false 提示: 树中节点的数目在范围 [0, 5000] 内 -1000 <= Node.val <= 1000 -1000 <= targetSum <= 1000 链接:https://leetcode-cn.com/problems/path-sum
非递归思路:用后序遍历的方法记录每到叶子结点时,当前栈中元素的总和是否与给定targetNum相等。
递归思路(官方题解):
观察要求我们完成的函数,我们可以归纳出它的功能:询问是否存在从当前节点 root 到叶子节点的路径,满足其路径和为 sum。
假定从根节点到当前节点的值之和为 val,我们可以将这个大问题转化为一个小问题:是否存在从当前节点的子节点到叶子的路径,满足其路径和为 sum - val。
不难发现这满足递归的性质,若当前节点就是叶子节点,那么我们直接判断 sum 是否等于 val 即可(因为路径和已经确定,就是当前节点的值,我们只需要判断该路径和是否满足条件)。若当前节点不是叶子节点,我们只需要递归地询问它的子节点是否能满足条件即可。
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), 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; if(root->val==targetSum&&root->left==nullptr&&root->right==nullptr) return true; return hasPathSum(root->left,targetSum-root->val)||hasPathSum(root->right,targetSum-root->val); } };
非常的巧妙
荡尘涤污,重整河山,便在今日

浙公网安备 33010602011771号