【劍指offer】二叉樹中和為某一值的路徑

蘭亭風雨發表於2014-05-19

轉載請註明出處: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:
    劍指offer上的第25題,採用遍歷的思想,只需對遍歷輸出的程式碼稍作修改即可,用一個輔助陣列(相當於棧)儲存查詢路徑,另外要注意輸出的格式,如果路徑有多條,要按字典順序依次輸出。

    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
****************************************************************/


相關文章