You are given a binary tree in which each node contains a value. Design an algorithm to print all paths which sum up to that value. Note that it can be any path in the tree - it does not have to start at the root.
按层遍历,然后每次从当前层往上走,如果发现和=sum,则输出该路径。
时间复杂度O(nlgn),空间复杂度O(nlgn)
#include <iostream>
#include <vector>
using namespace std;
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
TreeNode *createTree(int *num, int left, int right)
{
if (left > right)
return NULL;
int mid = (left + right) / 2;
TreeNode *node = new TreeNode(num[mid]);
node->left = createTree(num, left, mid - 1);
node->right = createTree(num, mid + 1, right);
return node;
}
TreeNode *sortedArrayToBST(int *num, int size)
{
createTree(num, 0, size - 1);
}
//=====================================
void findSum(TreeNode *head, int sum, vector<int> buffer, int level)
{
if (head == NULL)
return;
int tmp = sum;
buffer.push_back(head->val);
for (int i = level; i >= 0; i--)
{
tmp -= buffer[i];
if(tmp == 0)
{
for (int j = i; j <= level; j++)
cout << buffer[j] << " ";
cout << endl;
}
}
findSum(head->left, sum, buffer, level + 1);
findSum(head->right, sum, buffer, level + 1);
}
int main()
{
int num[]= {1,2,3,4,5,6,7,8,9};
TreeNode *head = sortedArrayToBST(num,9);
vector<int> v;
findSum(head, 5, v, 0);
return 0;
}