[面试题]在二叉树中找出和为某一值的所有路径
来源:互联网 发布:淘宝退款对买家的影响 编辑:程序博客网 时间:2024/04/29 13:28
输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出和与输入整数相等的所有路径。
例如输入整数22 和如下二元树
10
/ \
5 12
/ \
4 7
则打印出两条路径:10, 12 和10, 5, 7。
思路:
1、当访问到某一节点时,把该结点的值添加到当前和变量,且把该结点压入栈中。
2、若结点为叶子结点,且当前和变量==期望的和,则打印栈中的结点值,即为所需的路径。
3、若结点不是叶子结点,继续访问它的左孩子结点,访问它的右孩子结点。
4、删除该结点。包括从当前和变量中减去结点值,从栈中弹出结点值。此时,已回到父结点。
典型的排列题, 用DFS. 程序中的栈,利用STL中的vector,这样简化了编码工作。
#include <iostream>#include <vector>using namespace std;struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; void findPath(vector<vector<int> > &result, TreeNode * root, int expectedSum, vector<int> &path, int currentSum){<span style="white-space: pre;"></span><span style="white-space:pre"></span>path.push_back(root->val);<span style="white-space: pre;"></span><span style="white-space:pre"></span>currentSum += root->val;<span style="white-space: pre;"></span><span style="white-space: pre;"></span><span style="white-space:pre"></span>if(currentSum == expectedSum)<span style="white-space: pre;"></span><span style="white-space:pre"></span>{<span style="white-space: pre;"></span><span style="white-space:pre"></span>result.push_back(path);<span style="white-space: pre;"></span><span style="white-space:pre"></span>return;<span style="white-space: pre;"></span><span style="white-space:pre"></span>}<span style="white-space: pre;"></span><span style="white-space: pre;"></span><span style="white-space:pre"></span>if(root == NULL)<span style="white-space: pre;"></span><span style="white-space:pre"></span>{<span style="white-space: pre;"></span><span style="white-space:pre"></span>return;<span style="white-space: pre;"></span><span style="white-space:pre"></span>}<span style="white-space: pre;"></span><span style="white-space: pre;"></span><span style="white-space:pre"></span>if(root->left != NULL)<span style="white-space: pre;"></span><span style="white-space:pre"></span>{<span style="white-space: pre;"></span><span style="white-space:pre"></span>findPath(result, root->left, expectedSum, path, currentSum);<span style="white-space: pre;"></span><span style="white-space:pre"></span>}<span style="white-space: pre;"></span><span style="white-space:pre"></span>if(root->right != NULL)<span style="white-space: pre;"></span><span style="white-space:pre"></span>{<span style="white-space: pre;"></span><span style="white-space:pre"></span>findPath(result, root->right, expectedSum, path, currentSum);<span style="white-space: pre;"></span><span style="white-space:pre"></span>}<span style="white-space: pre;"></span><span style="white-space:pre"></span>path.pop_back();<span style="white-space: pre;"></span><span style="white-space:pre"></span>return;}int main(){ // generate test data TreeNode a0(10); TreeNode a1(5);TreeNode a2(12); TreeNode a3(4);TreeNode a4(7); a0.left = &a1; a0.right = &a2; a1.left = &a3; a1.right = &a4; TreeNode * root = &a0; // <span style="white-space: pre;"></span><span style="white-space:pre"></span>vector<vector<int> > result;<span style="white-space: pre;"></span><span style="white-space:pre"></span>vector<int> path;<span style="white-space: pre;"></span><span style="white-space:pre"></span>findPath(result, root, 22, path, 0);<span style="white-space: pre;"></span><span style="white-space: pre;"></span><span style="white-space:pre"></span>cout <<"Test result is :" << endl;<span style="white-space: pre;"></span><span style="white-space:pre"></span>for(int i = 0; i < result.size(); i++)<span style="white-space: pre;"></span><span style="white-space:pre"></span>{<span style="white-space: pre;"></span><span style="white-space:pre"></span>for(int j = 0; j < result[i].size(); j++)<span style="white-space: pre;"></span><span style="white-space:pre"></span>{<span style="white-space: pre;"></span><span style="white-space:pre"></span>cout <<result[i][j]<< " ";<span style="white-space: pre;"></span><span style="white-space:pre"></span>}<span style="white-space: pre;"></span><span style="white-space:pre"></span>cout << endl;<span style="white-space: pre;"></span><span style="white-space:pre"></span>}<span style="white-space: pre;"></span><span style="white-space: pre;"></span><span style="white-space:pre"></span>return 0;}
0 0
- [面试题]在二叉树中找出和为某一值的所有路径
- 微软,Google面试题 (4) —— 在二叉树中找出和为某一值的所有路径
- 【面试题】在二元树中找出和为某一值的所有路径
- 华为机试题之在二叉树中找出和为某一值的所有路径(java语言)
- 4. 微软面试题: 在二元树中找出和为某一值的所有路径(树)
- 在二元树中找出和为某一值的所有路径(树)----面试题系列
- 程序员面试题精选(4):在二元树中找出和为某一值的所有路径
- 程序员面试题精选100题(04)-在二元树中找出和为某一值的所有路径
- 程序员面试题精选(04)-在二元树中找出和为某一值的所有路径
- 程序员面试题精选(04)-在二元树中找出和为某一值的所有路径
- 程序员面试题精选100题(04)-在二元树中找出和为某一值的所有路径
- 程序员面试题精选100题(04)-在二元树中找出和为某一值的所有路径
- 【面试题】在二元树中找出和为某一值的所有路径——Java实现
- 算法与数据结构面试题(4)-在二元树中找出和为某一值的所有路径
- 数据结构面试题1.2.5-在二元树中找出和为某一值的所有路径
- 面试题06:在二元树中找出和为某一值的所有路径(未完待续)
- 在二叉树中找出和为某一值的所有路径
- 在二叉树中找出和为某一值的所有路径
- 导入classes.jar到项目
- WebView从assets中加载html5页面,实现定位功能
- jquery form插件(ajax)上传文件实现及原理
- 图像处理之简单脸谱检测算法
- selenium2.0关于python的常用函数
- [面试题]在二叉树中找出和为某一值的所有路径
- Swap Nodes in Pairs
- 集合中元素两两配对
- Android Studio使用经验总结
- 博弈论对数据科学家很重要吗?
- java代码生成二维码
- 【PAT】1056. Mice and Rice (25)
- 2015软考在线真题
- 源码编译安装 MySQL 5.5.x 实践