leetcode题库--112路径总和

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

说明: 叶子节点是指没有子节点的节点。
思路:
思路比较简单,就是递归将前面的和传下去,加上自身的值判断是否等于目标和。

    bool hasPathSum(TreeNode* root, int sum) {

        if(dfs(root, sum, 0))
        {
            return true;
        }
        return false;
    }

    bool dfs(TreeNode* root, int target, int sum)
    {
        if(root == nullptr)
        {
            return false;
        }

        sum += root->val;
        if(sum == target)
        {
            if(!root->left && !root->right)
            return true;
        }
        return dfs(root->left, target, sum) || dfs(root->right, target, sum);

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

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

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

          5
         / \
        4   8
       /   / \
      11  13  4
     /  \    / \
    7    2  5   1
返回:

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

思路:
和上一题类似,就是需要用一个vector来记录当前的路径,满足条件就放入结果中。由于需要找到所有的路径,需要遍历所有节点。

vector<vector<int>> pathSum(TreeNode* root, int sum) {
        vector<int> path;
        dfspath(root, sum, path, 0);

        return rec;
        
    }

    void dfspath(TreeNode* root, int target, vector<int>& path, int sum)
    {
        if(root==nullptr)return;
        sum += root->val;
        path.push_back(root->val);
        if(sum == target)
        {
            if(!root->left && !root->right)
            {
                rec.push_back(path);
                path.pop_back();
                return;
            }
        }
        
        if(root->left)
        {
            dfspath(root->left, target, path, sum);
        }
        
        if(root->right)
        {
            dfspath(root->right, target, path, sum);
        }

        path.pop_back();    //加入路径,  函数结束就要删除路径

    }

    vector<vector<int>> rec;
  1. 路径总和 III

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

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

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

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

示例:

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

      10
     /  \
    5   -3
   / \    \
  3   2   11
 / \   \
3  -2   1

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

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

思路:
由于不需要根节点和叶子节点的约束,因此在遍历每个节点的时候都要判断从祖先节点到该节点是否有满足条件的路径。也很好计算,将根节点到每个节点的路径和,记录下来,然后判断sum - target == path[i]。sum 是当前节点的路径和,target是目标路径和,path[i]是遍历路径的每个节点的路径和。这个思路和两数之和类似。

int pathSum(TreeNode* root, int sum) {

        vector<int> path;
        path.push_back(0);       //加0 , 为了后面计算sum - target == path[i],将所有路径遍历
        dfspath(root, sum, path, 0);

        return ans;

    }

    void dfspath(TreeNode* root, int target, vector<int>& path, int sum)
    {
        if(root==nullptr)
        return ;

        sum += root->val;
        for(int i = 0; i < path.size(); ++i)
        {
            if(sum - target == path[i])
            {
                ans++;
            }
        }

        path.push_back(sum);

        if(root->left)
        {
            dfspath(root->left, target, path, sum);
        }

        if(root->right)
        {
            dfspath(root->right, target, path, sum);
        }

        path.pop_back();

    }

    int ans = 0;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章