原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/youxikaifa/2018/1224/265.html
在二叉树中找出和为某一值的所有路径
题目:
请写一个程序创建一棵二叉树,并按照一定规则,输出二叉树根节点到叶子节点的路径。
规则如下:
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";
}
上篇:上一篇:
unity3d简单的相机跟随及视野旋转缩放
下篇:下一篇:
常州微信游戏开发-字符串匹配的三种方法