本文主要是介绍【Leetcode学习笔记】路径总和,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
【题目描述】给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。
输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出:true
解释:等于目标和的根节点到叶节点路径如上图所示。
本题难度标记为简单,但是递归思想总是让我头疼,每次都要调试看到一步步的过程才清晰明了。
ACM模式代码
#include <iostream>
#include <vector>
#include <string>
#include <unordered_map>
#include <algorithm>
#include <stack>using namespace std;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 backtracking(TreeNode* root, int target){if(root->left == nullptr && root->right == nullptr && target == 0){return true;}if(root->left == nullptr && root->right == nullptr && target != 0){return false;}if(root->left != nullptr){if(backtracking(root->left, target-root->left->val) == true){return true;}}if(root->right != nullptr){if(backtracking(root->right, target-root->right->val) == true){return true;} }return false;}bool hasPathSum(TreeNode* root, int targetSum) {if(root == nullptr) return false;return backtracking(root, targetSum-root->val);}
};int main() {TreeNode* root = new TreeNode(5);TreeNode* node1 = new TreeNode(4);TreeNode* node2 = new TreeNode(8);TreeNode* node3 = new TreeNode(11);TreeNode* node4 = new TreeNode(13);TreeNode* node5 = new TreeNode(4);TreeNode* node6 = new TreeNode(7);TreeNode* node7 = new TreeNode(2);TreeNode* node8 = new TreeNode(1);root->left = node1;root->right = node2;node1->left = node3;node2->left = node4;node2->right = node5;node3->left = node6;node3->right = node7;node5->right = node1;Solution solution;bool result = solution.hasPathSum(root, 22);std::cout << "Has path sum 22: " << (result ? "true" : "false") << std::endl;// Clean updelete root->left->left->left;delete root->left->left->right;delete root->left->left;delete root->left;delete root->right->right->right;delete root->right->right;delete root->right->left;delete root->right;delete root;return 0;
}
- 创建示例,需要手动建立节点之间的关系。
- 要清楚递归函数的返回值,本题中是bool类型,应当时刻注意传递给上一级的是true或false,如果某一条完整路径返回了true,本函数也将提前结束。
- 要清楚传入参数,第二个参数是一个统计值,进到递归函数的第一步就要判断该值是否为零,所以尤其需要注意main函数传入初始参数。
这篇关于【Leetcode学习笔记】路径总和的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!