leetcode112\113\437 路径总和三道(Medium)

leetcode112 路径总和I

题目来源:leetcode112 路径总和I

题目描述:

给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。

说明: 叶子节点是指没有子节点的节点。

示例: 
给定如下二叉树,以及目标和 sum = 22,

          5
         / \
        4   8
       /   / \
      11  13  4
     /  \      \
    7    2      1

返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2。

解题思路:

从根节点开始,每到一个节点从sum扣掉当前节点的值,到叶子结点的时候判断sum是否为0。递归的判断左子树和右子树。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool hasPathSum(TreeNode* root, int sum) {
          if(root==NULL) {
           return false;
        }
        sum-=root->val;
        if(sum==0&&root->left==NULL&&root->right==NULL) return true;//到叶子节点判断递归终止。
        return hasPathSum(root->left,sum)||hasPathSum(root->right,sum);//递归的判断左子树和右子树
    }
};

leetcode113 路径总和II

题目来源:leetcode113 路径总和II

题目描述:

给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。

说明: 叶子节点是指没有子节点的节点。

示例:
给定如下二叉树,以及目标和 sum = 22,

          5
         / \
        4   8
       /   / \
      11  13  4
     /  \    / \
    7    2  5   1

返回:

[
[5,4,11,2],
[5,8,4,5]
]

解题思路:

和112类似,只是要求记录路径,需要用回溯,递归终止时需要把当前路径加入结果集。回溯的要点是选择-回溯-撤销选择。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> ans;
    vector<int> temp;
    vector<vector<int>> pathSum(TreeNode* root, int sum) {
        if(root==NULL) return ans;
        temp.push_back(root->val);//选择
        sum-=root->val;
        if(sum==0&&root->left==NULL&&root->right==NULL) {
            ans.push_back(temp);
        }
        //回溯
        pathSum(root->left,sum);
        pathSum(root->right,sum);
        temp.pop_back();//撤销选择
        return ans;
    }
};

leetcode437 路径总和III

题目来源:leetcode437 路径总和III

题目描述:

给定一个二叉树,它的每个结点都存放着一个整数值。

找出路径和等于给定数值的路径总数。

路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。

二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。

示例:

root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8

返回 3。和等于 8 的路径有:

  1. 5 -> 3
  2. 5 -> 2 -> 1
  3. -3 -> 11

解题思路:

由于不一定从根节点开始,也不要求从叶子结点结束。可以用双重dfs。
①先序递归遍历每个节点②以每个节点作为起始节点DFS寻找满足条件的路径

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int ans=0;
    void dfs(TreeNode* root,int sum){
        if(root==NULL) return;
        sum-=root->val;
        if(sum==0){
            ans++;
        }
        dfs(root->left,sum);
        dfs(root->right,sum);
    }
    int pathSum(TreeNode* root, int sum) {
        if(root==NULL) return ans;
        dfs(root,sum);
        pathSum(root->left,sum);
        pathSum(root->right,sum);
        return ans;
    }
};
posted @ 2020-07-12 09:10  拉里拉里啦啦  阅读(181)  评论(0编辑  收藏  举报