zoukankan      html  css  js  c++  java
  • Leetcode | Path Sum I && II

    Path Sum I 

    Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all the values along the path equals the given sum.

    For example:
    Given the below binary tree and sum = 22,

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

    return true, as there exist a root-to-leaf path 5->4->11->2 which sum is 22.

    递归求解就可以。注意叶子结点条件是左右结点都为空。

     1 /**
     2  * Definition for binary tree
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 public:
    12     bool hasPathSum(TreeNode *root, int sum) {
    13         if (root == NULL) return false;
    14         return recursive(root, sum, 0);
    15     }
    16     
    17     bool recursive(TreeNode *root, int sum, int cur) {
    18         if (root == NULL) {
    19             return false;
    20         }
    21         
    22         cur += root->val;
    23         
    24         // leaf
    25         if (root->left == NULL && root->right == NULL) {
    26             return cur == sum;
    27         }
    28         
    29         bool res = recursive(root->left, sum, cur);
    30         if (res) return true;
    31         return recursive(root->right, sum, cur);
    32     }
    33 };

    第三次刷写得简洁许多,我今天已经重复了好多次这一句了。。。

     1 /**
     2  * Definition for binary tree
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 public:
    12     bool hasPathSum(TreeNode *root, int sum) {
    13         if (root == NULL) return false;
    14         sum -= root->val;
    15         if (root->left == NULL && root->right == NULL && sum == 0) return true;
    16         return (hasPathSum(root->left, sum) || hasPathSum(root->right, sum));
    17     }
    18 };

    Path Sum II

    Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given sum.

    For example:
    Given the below binary tree and sum = 22,

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

    return

    [
       [5,4,11,2],
       [5,8,4,5]
    ]
     1 /**
     2  * Definition for binary tree
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 public:
    12     vector<vector<int> > pathSum(TreeNode *root, int sum) {
    13         if (root == NULL) return ret;
    14         vector<int> v;
    15         
    16         int curSum = 0;
    17         recursive(root, sum, curSum, v);
    18         return ret;
    19     }
    20     
    21     void recursive(TreeNode *root, int sum, int curSum, vector<int> &v) {
    22         if (root == NULL) return;
    23         
    24         curSum += root->val;
    25         v.push_back(root->val);
    26         if (root->left == NULL && root->right == NULL) {
    27             if (curSum == sum) {
    28                 ret.push_back(v);
    29             }
    30         }
    31         recursive(root->left, sum, curSum, v);
    32         recursive(root->right, sum, curSum, v);
    33         v.pop_back();
    34     }
    35 
    36 private:
    37     vector<vector<int> > ret;
    38 };
    第三次。
     1 class Solution {
     2 public:
     3     void recurse(TreeNode *root, int sum, vector<int> &temp, vector<vector<int> > &ans) {
     4         if (root == NULL) return;
     5         sum -= root->val;
     6         temp.push_back(root->val);
     7         if (root->left == NULL && root->right == NULL && sum == 0) {
     8             ans.push_back(temp);
     9         } else {
    10             recurse(root->left, sum, temp, ans);
    11             recurse(root->right, sum, temp, ans);
    12         }
    13         temp.pop_back();
    14     }
    15     vector<vector<int> > pathSum(TreeNode *root, int sum) {
    16         vector<vector<int> > ans;
    17         vector<int> temp;
    18         recurse(root, sum, temp, ans);
    19         return ans;
    20     }
    21 };
  • 相关阅读:
    tool button 工具按钮
    push button 交替输出
    信号和槽
    qt新建一个工程
    lambda表达式
    横向滚动插件
    jquery循环延迟加载,用于在图片加载完成后再加载js
    dedecms的特性-----不完整
    让边框和文本一样高,不受line-height影响,可以使用padding,padding可以用于行内元素
    行内元素的行高对布局也有影响
  • 原文地址:https://www.cnblogs.com/linyx/p/3718379.html
Copyright © 2011-2022 走看看