您的位置:首页 > 其它

在二叉树中找出和为某一值的所有路径

2016-08-16 18:57 471 查看
题目:

请写一个程序创建一棵二叉树,并按照一定规则,输出二叉树根节点到叶子节点的路径。

规则如下:
1、从最顶端的根结点,到最下面的叶子节点,计算路径通过的所有节点的和,如果与设置的某一值的相同,那么输出这条路径上的所有节点。

2、从根节点遍历树时,请请按照左到右遍历,即优先访问左子树的节点。

二叉树创建规则:从上到下一层一层的,按照从左到右的顺序进行构造

输入"10,5,12,4,7"值,构造的树如下:

1) 10

2) 10
/
5

3) 10
/\
5 12

4) 10
/\
5 12
/
4

5) 10
/\
5 12
/\
4 7

针对上面的二叉树,如果当前我们设置的“路径和”为19,那么输出结果为:

10,5,4

如果有多个路径,按到左到右的顺序遍历生成的结果每行显示一个显示。例如如果当前我们设置的“路径和”为22,那么输出结果为:

10,5,7

10,12

如果没有找到路径和为设置的值的路径,输出error。

运行时间限制:无限制
内存限制:无限制
输入:输入整数N---路径和

一行字符串,多个正整数,之间用","隔开

输出:满足条件的二叉树路径

样例输入:
22
10,5,12,4,7

样例输出:
10,5,7
10,12

代码:

#include <iostream>
#include <sstream>
#include <vector>
#include <stdlib.h>

using namespace std;

struct TreeNode
{
int val;
TreeNode *left, *right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

void creatTree(TreeNode *&root, vector<int>& a, int i, int len)
{
if (i >= len)
return;
root = new TreeNode(a[i]);
creatTree(root->left, a, 2 * i + 1, len);
creatTree(root->right,a, 2 * i + 2, len);
}

void inorderTraversal(TreeNode* root)
{
if (root)
{
cout << root->val << " ";
inorderTraversal(root->left);
inorderTraversal(root->right);
}
}

vector<int> vec;
int sum = 0;
bool isCoutBlank = false;
bool isFind = false;
void pathTree(TreeNode*& root, int target)
{
sum += root->val;
vec.push_back(root->val);
if (sum == target && !root->left && !root->right)
{
isFind = true;
if(isCoutBlank)
cout << endl;
isCoutBlank = true;
for (int i = 0; i < vec.size() - 1; ++i)
{
cout << vec[i]<< ",";
}
cout << vec[vec.size() - 1];
}
if (root->left)
pathTree(root->left, target);
if (root->right)
pathTree(root->right, target);
sum -= root->val;
vec.pop_back();
}

int main()
{
TreeNode* root = nullptr;
int target;
cin >> target;
string val;
cin >> val;
string temp;
stringstream ss(val);
int node;
vector<int> nodes;
while (!ss.eof())
{
getline(ss, temp, ',');
stringstream stmp;
stmp << temp;
stmp >> node;
nodes.push_back(node);
}
creatTree(root, nodes, 0, nodes.size());
pathTree(root,target);
if (!isFind)
cout << "error";
}


另一种方法:用多个临时vector存储路径值,不用做pop_back操作

#include <iostream>
#include <sstream>
#include <vector>
#include <numeric>

using namespace std;

struct TreeNode
{
int val;
TreeNode *left, *right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

void creatTree(TreeNode *&root, vector<int>& a, int i, int len)
{
if (i >= len)
return;
root = new TreeNode(a[i]);
creatTree(root->left, a, 2 * i + 1, len);
creatTree(root->right,a, 2 * i + 2, len);
}

void inorderTraversal(TreeNode* root)
{
if (root)
{
cout << root->val << " ";
inorderTraversal(root->left);
inorderTraversal(root->right);
}
}

vector<int> vec;
int sum = 0;
bool isCoutBlank = false;
bool isFind = false;
void pathTree(TreeNode*& root, int target)
{
sum += root->val;
vec.push_back(root->val);
if (sum == target && !root->left && !root->right)
{
isFind = true;
if(isCoutBlank)
cout << endl;
isCoutBlank = true;
for (int i = 0; i < vec.size() - 1; ++i)
{
cout << vec[i]<< ",";
}
cout << vec[vec.size() - 1];
}
if (root->left)
pathTree(root->left, target);
if (root->right)
pathTree(root->right, target);
sum -= root->val;
vec.pop_back();
}

void dfs(vector<int> v, TreeNode*& root, int level, int target)
{
if (!root)
return;
v[level++] = root->val;
int sum = accumulate(v.begin(), v.end(),0);
if (!root->left && !root->right && sum == target)
{
isFind = true;
for (int i = 0; i < level; ++i)
{
if (i != 0)
cout << ",";
cout << v[i];
}
cout << endl;
}
if (root->left)
dfs(v, root->left, level, target);
if (root->right)
dfs(v, root->right, level, target);
}

int main()
{
TreeNode* root = nullptr;
int target;
cin >> target;
string val;
cin >> val;
string temp;
stringstream ss(val);
int node;
vector<int> nodes;
while (!ss.eof())
{
getline(ss, temp, ',');
stringstream stmp;
stmp << temp;
stmp >> node;
nodes.push_back(node);
}
creatTree(root, nodes, 0, nodes.size());
//     pathTree(root,target);
//     if (!isFind)
//         cout << "error";
vector<int> vec(nodes.size());
dfs(vec, root, 0, target);
if (!isFind)
cout << "error";
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: