【劍指offer】二叉樹中和為某一值的路徑
轉載請註明出處:http://blog.csdn.net/ns_code/article/details/26141815
- 題目描述:
輸入一顆二叉樹和一個整數,列印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。
- 輸入:
每個測試案例包括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
****************************************************************/
相關文章
- 劍指 Offer 34. 二叉樹中和為某一值的路徑二叉樹
- 劍指 Offer 34. 二叉樹中和為某一值的路徑(java解題)二叉樹Java
- (python版)《劍指Offer》JZ24:二叉樹中和為某一值的路徑Python二叉樹
- 面試題34:二叉樹中和為某一值的路徑面試題二叉樹
- JZ-024-二叉樹中和為某一值的路徑二叉樹
- 劍指offer——重建二叉樹二叉樹
- 【劍指offer】二叉樹深度二叉樹
- 劍指offer(四)重建二叉樹二叉樹
- 劍指Offer-40-二叉樹的深度二叉樹
- 劍指offer——二叉樹的映象C++二叉樹C++
- 【劍指offer】27. 二叉樹的映象二叉樹
- 劍指offer——二叉樹的深度C++二叉樹C++
- 《劍指offer》:[59]對稱的二叉樹二叉樹
- 《劍指offer》:[39]求解二叉樹的深度二叉樹
- 劍指 Offer 07. 重建二叉樹二叉樹
- 【劍指offer】判斷二叉樹平衡二叉樹
- 劍指offer | 55 - I. 二叉樹的深度二叉樹
- 《劍指offer》:[41]陣列中和為S的兩個數陣列
- [劍指offer] 把二叉樹列印成多行二叉樹
- 《劍指offer》:[62]序列化二叉樹二叉樹
- 《劍指offer》:[66]矩陣中的路徑矩陣
- 《劍指offer》:[39-1]判斷是否為平衡二叉樹二叉樹
- 【劍指offer】5.二叉樹的映象和列印二叉樹
- 力扣 - 劍指 Offer 27. 二叉樹的映象力扣二叉樹
- 《劍指offer》:[60]把二叉樹列印成多行二叉樹
- 【劍指offer】從上向下列印二叉樹二叉樹
- # 劍指 Offer 68 - II. 二叉樹的最近公共祖先二叉樹
- 《劍指offer》:[58]二叉樹的下一個結點二叉樹
- 劍指offer(C++)——把二叉樹列印成多行C++二叉樹
- 劍指offer:JZ12 矩陣中的路徑矩陣
- 【劍指offer】樹的子結構
- 劍指offer--把二叉樹列印成多行(C++)二叉樹C++
- 《劍指offer》之在完全二叉樹中新增子節點二叉樹
- 劍指offer——從上往下列印二叉樹C++二叉樹C++
- 《劍指offer》:[61]按之字形順序列印二叉樹二叉樹
- 劍指Offer 表示數值的字串字串
- 劍指 Offer 12-矩陣中的路徑c++矩陣C++
- 力扣 - 劍指 Offer 12. 矩陣中的路徑力扣矩陣