【劍指offer】二叉樹中和為某一值的路徑
阿新 • • 發佈:2019-01-01
- 題目描述:
輸入一顆二叉樹和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。
- 輸入:
每個測試案例包括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:
AC程式碼:
#include<stdio.h> #include<stdlib.h> typedef struct BTNode { int data; int index; //節點的下標值(從1開始計算) int lchild; int rchild; }BTNode; //用陣列result儲存結果,引數top為最後一個元素的下標, //這裡其實相當於是用陣列模擬棧儲存結果序列。 BTNode result[100000]; /* 採用前序遍歷的方式列印和為sum的序列 */ void PrintFindPath(BTNode *pTree,int root,int exp,int top) { if(pTree==NULL|| root==-1) return; result[top] = pTree[root]; if(pTree[root].lchild==-1 && pTree[root].rchild==-1) { int sum = 0; int i; for(i=0;i<=top;i++) sum += result[i].data; if(sum == exp) { printf("A path is found:"); for(i=0;i<=top;i++) printf(" %d",result[i].index); printf("\n"); } } //根據題目要求,需要按照字典順序輸出,因此需要判斷索引下標的大小 if(pTree[root].lchild < pTree[root].rchild) { //這裡不需要再加判斷語句,在下層遞迴中的入口處會判斷 PrintFindPath(pTree,pTree[root].lchild,exp,top+1); PrintFindPath(pTree,pTree[root].rchild,exp,top+1); } else { PrintFindPath(pTree,pTree[root].rchild,exp,top+1); PrintFindPath(pTree,pTree[root].lchild,exp,top+1); } } int main() { int n,k; while(scanf("%d %d",&n,&k) != EOF) { BTNode *pTree = NULL; if(n>0) { pTree = (BTNode *)malloc(n*sizeof(BTNode)); if(pTree == NULL) exit(EXIT_FAILURE); int i; for(i=0;i<n;i++) { int vi,leftnode,rightnode; scanf("%d %d %d",&vi,&leftnode,&rightnode); pTree[i].data = vi; pTree[i].index = i+1; if(leftnode != -1) pTree[i].lchild = leftnode-1; else pTree[i].lchild = -1; if(rightnode != -1) pTree[i].rchild = rightnode-1; else pTree[i].rchild = -1; } } printf("result:\n"); PrintFindPath(pTree,0,k,0); free(pTree); } return 0; }
/**************************************************************
Problem: 1368
User: mmc_maodun
Language: C
Result: Accepted
Time:30 ms
Memory:2636 kb
****************************************************************/