zoukankan      html  css  js  c++  java
  • leetcode112113437 路径总和三道(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;
        }
    };
    
  • 相关阅读:
    Postfix邮件服务
    Python
    LVS
    MFS
    Apache
    Zookeeper集群 + Kafka集群 + KafkaOffsetMonitor 监控
    shell 检测安装包
    shell ssh 批量执行
    shell 判断脚本参数
    bzoj 1500 修改区间 splay
  • 原文地址:https://www.cnblogs.com/yjcoding/p/13287031.html
Copyright © 2011-2022 走看看