題目11:二叉樹中和為某一值的路徑
阿新 • • 發佈:2019-01-22
題目描述:
-
輸入一顆二叉樹和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。
- 輸入:
-
每個測試案例包括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:
本題一看挺簡單的,題意就是在n個結點形成的二叉樹中,找出從根結點到葉子結點的結點值之和等於所給出值k的路徑數!做本題 的時候,由於太大意了,有很多地方沒有注意,特別是題目要求路徑要按字典序輸出,寫過過了樣例後,一直交,就是WA,最後再仔細看題目才發現沒按字典序輸出!!以後做題要特別仔細了! 以下是AC程式碼: #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <cctype> #include <cstdlib> #include <string.h> #include <algorithm> #include <cmath> using namespace std; #define N 10100 struct Node { int index; int value; int left; int right; }; struct Node p[N]; int path[N]; void dfs(int n,int k,int index,int sum,int c) { int i ; if(sum > k) return; if((sum == k )&& (p[index].left == -1) && (p[index].right == -1)) { printf("A path is found:"); for(i = 0;i <= c;i++) printf(" %d",path[i]); printf("\n"); return; } if(p[index].left != -1) { c++; path[c] = p[p[index].left].index; dfs(n,k,p[index].left,sum + p[p[index].left].value,c); c--; } if(p[index].right != -1) { c++; path[c] = p[p[index].right].index ; dfs(n,k,p[index].right,sum + p[p[index].right].value,c); c--; } return; } int main() { int n,k,i,sum; int v , l , r; while(scanf("%d %d",&n,&k) == 2) { memset(p,-1,sizeof(p)); for(i = 0;i < n;i++) { scanf("%d %d %d",&v,&l,&r); p[i].index = i + 1; p[i].value = v; if( l < r)//一開始就是這裡沒注意,一直wa,這是按字典序輸出的關鍵! { p[i].left = l; p[i].right = r; } else { p[i].left = r; p[i].right = l; } if(p[i].left != -1) p[i].left--; if(p[i].right != -1) p[i].right--; } printf("result:\n"); sum = p[0].value; path[0] = 1; dfs(n,k,0,sum,0); } return 0; }