失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 剑指offer-JZ82 二叉树中和为某一值的路径(一)(附区分DFS和回溯)

剑指offer-JZ82 二叉树中和为某一值的路径(一)(附区分DFS和回溯)

时间:2021-01-28 12:00:36

相关推荐

剑指offer-JZ82 二叉树中和为某一值的路径(一)(附区分DFS和回溯)

描述

给定一个二叉树root和一个值 sum ,判断是否有从根节点到叶子节点的节点值之和等于 sum 的路径。

1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点

2.叶子节点是指没有子节点的节点

3.路径只能从父节点到子节点,不能从子节点到父节点

4.总节点数目为n

例如:

给出如下的二叉树,\ sum=22sum=22,

返回true,因为存在一条路径5\to 4\to 11\to 25→4→11→2的节点值之和为 22

思路:

这个题给我的启发是:DFS回溯和递归到底怎么区分!?

不回头的是递归,回头的(有反悔语句的)是DFS回溯,DFS回溯得标好起终点和”map“。

我的代码是先序遍历,可以看到now代表现在的长度,但是它没有返回,now每次进了函数就是只加不减,所以应该是借鉴了DFS思想的先序遍历(递归)。

注释掉的代码是其他人的题解,那是正宗的递归求解。大致思路都是now代表现在的路数,sum是总路数,到叶子节点,同时now==sum的时候,说明找到了这样的一条路,返回true,否则返回false,用now加可以,sum逐个减也可以。

/*** struct TreeNode {*int val;*struct TreeNode *left;*struct TreeNode *right;* };*/class Solution {public:/*** * @param root TreeNode类 * @param sum int整型 * @return bool布尔型*//*//递归求解,当root为空返回false,当到达叶子节点,并且和位sum返回true//其他情况递归调用左右子树class Solution {public:bool hasPathSum(TreeNode *root, int sum) {if(root == NULL)return false;if(root->left == NULL && root->right == NULL && sum - root->val == 0)return true;return hasPathSum(root->left,sum-root->val) || hasPathSum(root->right,sum-root->val);}};*/bool hasPathSum(TreeNode* root, int sum) {// write code hereif(!root)return false; return find(root,sum,0);}bool find(TreeNode* root, int sum,int now){if(!root)return false;else{now+=root->val;if(!root->left&&!root->right&&now==sum)return true;return find(root->left, sum, now)||find(root->right,sum,now);}}};

如果觉得《剑指offer-JZ82 二叉树中和为某一值的路径(一)(附区分DFS和回溯)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。