問題描述:給定一個二叉樹,找出所有路徑中各節點相加總和等於給定 目標值 的路徑。一個有效的路徑,指的是從根節點到葉節點的路徑。
來源:LintCode
作者:syt
日期:2017-11-10
*/
#include <iostream>
class TreeNode
{
public:
int val;
TreeNode *left, *right;
TreeNode(){}
TreeNode(int val, TreeNode *lptr = NULL, TreeNode *rptr = NULL) {
this->val = val;
this->left = lptr;
this->right = rptr;
}
};
#include "d_tree.h"
#include <vector>
using namespace std;
void calPathSum(TreeNode *node, vector<vector<int> > &result, vector<int> tmp, int target, int sum)
{
if (node->right == NULL && node->left == NULL)
{
if (sum == target)
result.push_back(tmp);
return;
}
if (node->left != NULL)
{
tmp.push_back(node->left->val);
calPathSum(node->left, result, tmp, target, sum + node->left->val);
tmp.pop_back();
}
if (node->right != NULL)
{
tmp.push_back(node->right->val);
calPathSum(node->right, result, tmp, target, sum + node->right->val);
tmp.pop_back();
}
}
/**
* @param root the root of binary tree
* @param target an integer
* @return all valid paths
*/
vector<vector<int>> binaryTreePathSum(TreeNode *root, int target) {
// Write your code here
vector<vector<int> > result;
if (root != NULL)
{
int sum = root->val;
vector<int> tmp = { root->val };
calPathSum(root, result, tmp, target, sum);
}
return result;
}
TreeNode *buildTree(int n)
{
TreeNode *root, *b, *c, *d, *e, *f, *g, *h;
switch (n)
{
case 1:
e = new TreeNode(3);
d = new TreeNode(2);
c = new TreeNode(4);
b = new TreeNode(2, d, e);
root = new TreeNode(1, b, c);
break;
case 2:
h = new TreeNode(9);
g = new TreeNode(7);
f = new TreeNode(6);
e = new TreeNode(5);
d = new TreeNode(4, g, h);
c = new TreeNode(3, e, f);
b = new TreeNode(2, d, (TreeNode *)NULL);
root = new TreeNode(1, b, c);
break;
}
return root;
}
void main()
{
TreeNode *root = buildTree(1);
vector<vector<int> > result = binaryTreePathSum(root, 5);
for (int i = 0; i < result.size(); i++)
{
for (int j = 0; j < result[i].size(); j++)
{
cout << result[i][j] << " ";
}
cout << endl;
}
}