给定一颗树(双亲表示法)和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。
算法思想:首先找到所有叶子节点,然后向上回溯,并记录下路径和符合条件的经过的所有节点。
#include<stdio.h>
#define maxsize 100
typedef struct PTNode
{
char data;
int parent;
}PTNode;//树的节点类型
typedef struct PTree
{
PTNode Tnode[maxsize];
int n;//树的节点个数
}PTree;//树
//建树
PTree CreatePTree()
{
int i,n,parentId;
char data;
PTree newTree;
scanf("%d",&n);
newTree.n = n;
getchar();
for(i=0;i<n;i++)
{
scanf("%c %d",&data,&parentId);
newTree.Tnode[i].data = data;
newTree.Tnode[i].parent = parentId;
getchar();
}
return newTree;
}
//查找路径
void Road(PTree pt,int s)
{
int i,j,k,t,sum;
char a[maxsize];
PTNode p;//p为工作指针
for(i=0;i<pt.n;i++)
{
for(j=0;j<pt.n;j++)
{
//查找叶子节点
if(pt.Tnode[j].parent==i)
break;
}
if(j==pt.n)
{
sum=0;
k=0;
a[k++]=pt.Tnode[i].data;
p=pt.Tnode[i];
//向上回溯记录路径上的节点
while(p.parent!=-1)
{
sum++;
a[k++]=pt.Tnode[p.parent].data;
p=pt.Tnode[p.parent];
}
if(sum==s)
{
for(t=k-1;t>=0;t--)
printf("%c ",a[t]);
printf("\n");
}
}
}
}
int main(void)
{
int sum;
PTree newTree = CreatePTree();
scanf("%d",&sum);
printf("符合条件的路径为:\n");
Road(newTree,sum);
return 0;
}