题目:输入一个整数和一棵二元树。
从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出和与输入整数相等的所有路径。
例如输入整数22 和如下二元树
10
/ \
5 12
/ \
4 7
则打印出两条路径:10, 12 和10, 5, 7。
很简单的一个问题,可以在后序遍历二叉树的时候,进行判断,这里借助了一个辅助的数据结构,堆栈来存储之前遍历的节点。
代码如下
#include <stdio.h>
#include <malloc.h>
typedef struct treenode
{
int data;
struct treenode *lchild;
struct treenode *rchild;
}*Tree;
int array[100];
int start=0;
int end=0;
Tree createTree(int array[],int length)
{
Tree nodes[100];
int i=0;
for(i=0;i<length;i++)
{
if(array[i]!=-1)
{
nodes[i]=(Tree )malloc(sizeof(struct treenode));
nodes[i]->data=array[i];
nodes[i]->lchild=NULL;
nodes[i]->rchild=NULL;
int j=(i-1)/2;
if(i>0&&i%2==1)
{
nodes[j]->lchild=nodes[i];
}
else if(i>0&&i%2==0)
{
nodes[j]->rchild=nodes[i];
}
}
else
{
nodes[i]=NULL;
}
}
return nodes[0];
}
int postTravel(Tree tree,int sum,int def)
{
if(tree!=NULL)
{
sum=sum+tree->data;
array[end]=tree->data;
end++;
postTravel(tree->lchild,sum,def);
postTravel(tree->rchild,sum,def);
if(sum==def)
{
for(start=0;start<end;start++)
printf("%d ",array[start]);
printf("\n");
end--;
sum=sum-tree->data;
}
else
{
end--;
sum=sum-tree->data;
}
}
}
int main()
{
int i=0;
Tree tree;
int array[100];
int sum=0;
int def;
printf("please input the data,-1 represents null,ends with '#'\n");
while(scanf("%d",&array[i])==1)
{
i++;
}
printf("please input the sum\n");
getchar();
scanf("%d",&def);
printf("the result is below\n");
tree=createTree(array,i);
postTravel(tree,sum,def);
}