-
题目描述:
-
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
-
输入:
-
每个测试案例包括n+1行:
第一行为2个整数n,k(1<=n<=10000),n表示结点的个数,k表示要求的路径和,结点编号从1到n。
接下来有n行。这n行中每行为3个整数vi,leftnode,rightnode,vi表示第i个结点的值,leftnode表示第i个结点的左孩子结点编号,rightnode表示第i个结点的右孩子结点编号,若无结点值为-1。编号为1的结点为根结点。
-
输出:
-
对应每个测试案例,先输出“result:”占一行,接下来按字典顺序输出满足条件的所有路径,这些路径由结点编号组成,输出格式参照输出样例。
-
样例输入:
-
5 2210 2 35 4 512 -1 -14 -1 -17 -1 -11 51 -1 -1
-
样例输出:
-
result:A path is found: 1 2 5A path is found: 1 3result:
总结:递归思路还是要清晰,路径长度保持下次探查的深度,每一次处理当前问题(加上当前加点的值,而不是加之前的,杂糅在一起逻辑会混乱)
这道题要按字典序输出路径,而输入的左右子树的编号不一定满足左边<右边,比较简单的处理的就是 构建树的时候将小序号赋给左子树,这样会改变树的结构,但不影响求出的路径(自根向下有选择的将子树镜像变换)
另外也可以呆板地在往子树递归的时候先选择id比较小的子树而不是固定在左子树
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <string> #include <vector> using namespace std; struct TreeNode { int val; int lChildId; int rChildId; TreeNode() { lChildId=rChildId=-1; } }; TreeNode treeInfo[10001]; int Route[10000]; void FindSumKRoute(int rootPos,int n, int curSum, int k, int* route,int length) { if(rootPos>n)//error return; if(rootPos==-1) { return; } curSum+=treeInfo[rootPos].val; route[length]=rootPos; if(-1==treeInfo[rootPos].lChildId && -1==treeInfo[rootPos].rChildId) { if(curSum == k) { cout<<"A path is found:"; for(int i=0; i<=length; i++) cout<<" "<<route[i]; cout<<endl; } return; } FindSumKRoute(treeInfo[rootPos].lChildId,n,curSum,k,route,length+1); FindSumKRoute(treeInfo[rootPos].rChildId,n,curSum,k,route,length+1); return; } int main() { //freopen("in.txt","r",stdin); int n,k; while (cin>>n>>k) { for(int i=1; i<=n; i++) { int val,l,r; scanf("%d%d%d",&val,&l,&r); //cin>>val>>l>>r; treeInfo[i].val=val; if(l<r) //vital, not point input satisfy left < right treeInfo[i].lChildId=l,treeInfo[i].rChildId=r; else treeInfo[i].lChildId=r,treeInfo[i].rChildId=l; } cout<<"result:"<<endl; FindSumKRoute(1,n,0,k,Route,0); } return 0; } /************************************************************** Problem: 1368 User: xjbscut Language: C++ Result: Accepted Time:150 ms Memory:1668 kb ****************************************************************/