在二元树中找出和为某一值的所有路径(树)
题目:输入一个整数和一棵二元树。
从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出和与输入整数相等的所有路径。
例如 输入整数22和如下二元树
10
/ \
5 12
/ \
4 7
题目:输入一个整数和一棵二元树。
从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出和与输入整数相等的所有路径。
例如 输入整数22和如下二元树
10
/ \
5 12
/ \
4 7
则打印出两条路径:10, 12和10, 5, 7
#include<stdio.h>
#include<assert.h>
#include<malloc.h>
#define SUM 22
typedef struct _Node{
int elem;
struct _Node *left;
struct _Node *right;
}Node;
int x[20];
Node *root=NULL;
/*create a bitree*/
Node *Bitree(Node *root,int data)
{
if(root==NULL)
{
Node *p=(Node *)malloc(sizeof(Node));
assert(p);
p->elem=data;
p->left=NULL;
p->right=NULL;
root=p;
}
else if(data<=root->elem)
{
root->left=Bitree(root->left,data);
}
else
{
root->right=Bitree(root->right,data);
}
return root;
}
/*output*/
void output(int x[],int n)
{
int i=1;
Node *p=root;
printf("%d\t",p->elem);
while(i<=n)
{
if(x[i]==1)
{
p=p->left;
printf("%d\t",p->elem);
}
else if(x[i]==2)
{
p=p->right;
printf("%d\t",p->elem);
}
i++;
}
printf("\n");
}
/*find all of sub_trees*/
void bitree_sum(Node *root,int sum,int i)
{
if(root==NULL)
{
return;
}
else
{
sum+=root->elem;
if(sum==SUM)
{
output(x,i);
}
x[i+1]=1; //to left
bitree_sum(root->left,sum,i+1);
x[i+1]=2; //to right
bitree_sum(root->right,sum,i+1);
}
}
int main()
{
int i=0;
int array[]={10,5,4,7,12};
int len=sizeof(array)/sizeof(array[0]);
/*形成二叉排序树*/
while(i<len)
{
root=Bitree(root,array[i]);
i++;
}
/*输出和为sum的所有路径*/
bitree_sum(root,0,0);
return 0;
}