题目:输入一个整数和一棵二元树。
从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出和与输入整数相等的所有路径。
例如 输入整数22和如下二元树
10
/ \
5 12
/ \
4 7
则打印出两条路径:10, 12和10, 5, 7。
这个问题最近做得烂透了。
思路:把需要带到叶子的中间结果作为参数放在递归函数里,每次往里加~(我再看看别人又是如何写的。。)
我的代码:
#include <iostream> #include <stdlib.h> #include <stack> #include <queue> using namespace std; struct Node{ int data; Node* left; Node* right; Node(){} Node(int d){ data = d; left = NULL; right = NULL; } }; //所要找的和 int limit; //acc表示累计和 //myv保存路径 void find(Node* node, int acc, vector<int> myv){ if(node==NULL) return; acc += node->data; if(acc>limit) return; myv.push_back(node->data); if(acc==limit && node->left==NULL && node->right==NULL){ vector<int>::iterator it; for(it=myv.begin();it!=myv.end();it++){ printf("%d ",*it); } puts(""); return; } find(node->left,acc,myv); find(node->right,acc,myv); } int main(){ Node* root = new Node(1); Node* n1 = new Node(2); Node* n2 = new Node(3); Node* n3 = new Node(4); Node* n4 = new Node(5); Node* n5 = new Node(6); Node* n6 = new Node(7); Node* n7 = new Node(8); root->left = n1; root->right = n2; n1->left = n3; n1->right = n4; n2->left = n5; n2->right = n6; n3->left = n7; limit = 15;// 8/9/10 为测试数据 vector<int> myv; find(root,0,myv); return 0; }