发现我自己思考得到的方法相比百度搜索得到的TOP5解法似乎更容易理解,所以就把我的思路贴出来供大家借鉴。
这是一道微软面试题。
题目:输入一个整数和一棵二元树。
从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出和与输入整数相等的所有路径。
例如 输入整数22和如下二元树
10
/
5 12
/
4 7
则打印出两条路径:10, 12和10, 5, 7。
思路:使用先序遍历得到树的路径并求和就可以解决这一道题,但是由于需要打印出来,那么就需要把最后一个叶子节点前的节点保存起来,考虑使用容器比较方便。另一方面,如果当前路径得到的和大于输入的数,可以考虑剪枝。
代码如下:
void TravelOneSum(TreeNode* root, vector<int> dv, int sum) { if(root!=NULL) { if(sum-root->data<0) { return; } dv.push_back(root->data); if(root->left==NULL && root->right==NULL && (sum-root->data==0)) { for(vector<int>::iterator it=dv.begin();it!=dv.end();++it) { cout << *it << ' '; } cout << endl; } TravelOneSum(root->left,dv,sum-root->data); TravelOneSum(root->right,dv,sum-root->data); dv.pop_back(); } }