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

描述

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

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

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

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

4.总节点数目为n


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

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


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

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

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

 思路:

这个题给我的启发是: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 here
        if(!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,算法,数据结构,c++,剑指offer)