LeetCode题解:Path Sum I and II

来源:互联网 发布:js权威指南第六版 pdf 编辑:程序博客网 时间:2024/05/17 00:17

Path Sum

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.

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]]

思路:

递归post-order访问树的同时求和即可。这里采用了另外一个办法,与上述相似。

题解:

/** * Definition for binary tree * 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 == nullptr)            return false;                if (root->left == nullptr && root->right == nullptr)        {            if (sum == root->val)                return true;            else                return false;        }        else            return (root->left == nullptr ?                 false : hasPathSum(root->left, sum - root->val)) ||                (root->right == nullptr ?                false : hasPathSum(root->right, sum - root->val));                }};

思路:

preorder访问树,迭代进行。用一个vector保存路径。

/** * Definition for binary tree * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    vector<vector<int>> scratch;    vector<int> history;        void traverse(TreeNode* node, int sum)    {        history.push_back(node->val);        if (node->left == nullptr && node->right == nullptr &&             accumulate(begin(history), end(history), 0) == sum)            scratch.push_back(history);        if (node->left != nullptr)            traverse(node->left, sum);        if (node->right != nullptr)            traverse(node->right, sum);        history.pop_back();    }        vector<vector<int> > pathSum(TreeNode *root, int sum) {        scratch.clear();        if (root == nullptr)            return scratch;        traverse(root, sum);        return scratch;    }};


0 0
原创粉丝点击