在二叉树中找出和为某一值的所有路径
2016-08-16 18:57
471 查看
题目:
代码:
另一种方法:用多个临时vector存储路径值,不用做pop_back操作
请写一个程序创建一棵二叉树,并按照一定规则,输出二叉树根节点到叶子节点的路径。 规则如下: 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"; }
相关文章推荐
- 面试100题:4.在二叉树中找出和为某一值的所有路径
- 4.在二叉树中找出和为某一值的所有路径
- 二叉树中找出和为某一值的所有路径
- 第4题:在二叉树中找出和为某一值的所有路径
- 求出二叉树中找出和为某一值的所有路径
- 程序员面试100题(算法)之二叉树中找出和为某一值的所有路径(含二叉树前序创建、遍历)
- [面试题]在二叉树中找出和为某一值的所有路径
- 如何在二叉树中找出和为某一值的所有路径
- 华为机试题之在二叉树中找出和为某一值的所有路径(java语言)
- 在二叉树中找出和为某一值的所有路径
- 在二叉树中找出和为某一输入值的所有路径
- 在二叉树中找出和为某一值的所有路径
- 在二叉树中找出和为某一值的所有路径-java实现
- 在二叉树中找出和为某一值的所有路径
- 在二叉树中找出和为某一值的所有路径
- 在 二叉树中找出和为某一值的所有路径
- 在二叉树中找出和为某一值的所有路径
- 微软,Google面试题 (4) —— 在二叉树中找出和为某一值的所有路径
- 二叉树中找出和为某一值的所有路径
- 在二叉树中找出和为某一值的所有路径