题目1368:二叉树中和为某一值的路径
时间限制:1 秒
内存限制:32 兆
特殊判题:否
- 题目描述:
-
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
- 输入:
-
每个测试案例包括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 22 10 2 3 5 4 5 12 -1 -1 4 -1 -1 7 -1 -1 1 5 1 -1 -1
- 样例输出:
-
result: A path is found: 1 2 5 A path is found: 1 3 result:
#include <iostream> #include <stdio.h> #include <string.h> #include <string> #include <map> #include <vector> #include <set> #include <algorithm> #include <vector> #include <stack> #include <math.h> #include <stdlib.h> #include <fstream> #define Max(a,b) ((a)>(b)?(a):(b)) #define Min(a,b) ((a)<(b)?(a):(b)) using namespace std; typedef long long LL ; const int size=10008 ; struct Me{ struct Node{ int left ; int right ; }; Node node[size] ; int num[size] ; int ans[size] ; int N ,K; Me(){} ; Me(int n,int k):N(n),K(k){ for(int i=1;i<=N;i++) node[i].left=node[i].right=0 ; }; void read(){ int L ,R; for(int i=1;i<=N;i++){ scanf("%d%d%d",&num[i],&L,&R) ; if(L>R) swap(L,R) ; if(L!=-1) node[i].left=L ; if(R!=-1) node[i].right=R ; } } void dfs(int id ,int sum ,int select){ if(node[id].left==0&&node[id].right==0){ if(sum==K){ //ok printf("A path is found:") ; for(int i=0;i<select;i++) printf(" %d",ans[i]) ; puts("") ; } return ; } if(sum>K) return ; if(node[id].left){ ans[select]= node[id].left ; dfs(node[id].left,sum+num[node[id].left],select+1) ; } if(node[id].right){ ans[select]= node[id].right ; dfs(node[id].right,sum+num[node[id].right],select+1 ) ; } } int gao(){ read() ; puts("result:") ; ans[0]=1 ; dfs(1,num[1],1) ; } }; int main(){ int n , k; while(scanf("%d%d",&n,&k)!=EOF){ Me me(n,k) ; me.gao() ; } return 0 ; }