- 题目描述:
-
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
- 输入:
-
每个测试案例包括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的结点为根结点。
代码:
1 #include<stdio.h> 2 #include<cstring> 3 #include<stack> 4 using namespace std; 5 const int MAXN = 10500; 6 int n, k; 7 int tmp1, tmp2; 8 int node[MAXN]; 9 int mem[MAXN]; 10 int lft[MAXN]; 11 int rgt[MAXN]; 12 stack<int> st; 13 void Print(int num, int sum){ 14 if(num==-1||sum+node[num]>k) 15 return; 16 else{ 17 int i=num; 18 sum+=node[i]; 19 if(sum==k&&lft[num]==-1&&rgt[num]==-1){ 20 printf("A path is found:"); 21 while(i){ 22 st.push(i); 23 i=mem[i]; 24 } 25 while(!st.empty()){ 26 printf(" %d",st.top()); 27 st.pop(); 28 } 29 puts(""); 30 } 31 Print(lft[num],sum); 32 Print(rgt[num],sum); 33 } 34 } 35 int main(){ 36 while(~scanf("%d%d",&n,&k)){ 37 memset(node,0,sizeof(node)); 38 memset(mem,0,sizeof(mem)); 39 //记录父节点 40 memset(lft,0,sizeof(mem)); 41 //记录左子 42 memset(rgt,0,sizeof(mem)); 43 //记录右子 44 for(int i=1;i<=n;i++){ 45 scanf("%d%d%d",&node[i],&tmp1,&tmp2); 46 if(tmp1>tmp2) 47 swap(tmp1,tmp2); 48 if(tmp1>0) 49 mem[tmp1]=i; 50 if(tmp2>0) 51 mem[tmp2]=i; 52 lft[i]=tmp1; 53 rgt[i]=tmp2; 54 } 55 printf("result:\n"); 56 int sum=0; 57 Print(1,sum); 58 } 59 }
一开始想当然了,输入的时候第i行代表第i个结点的相关信息,但是也有可能是第4个结点,子结点是7和8,然后第8个结点的子结点是5,这样就不能在预处理的时候全部得到结点的最终值,而只能在深搜的时候获取相关信息。
时间: 2024-10-11 06:29:31