在二元樹中找出和為某一值的所有路徑(樹)
題目:輸入一個整數和一棵二元樹。
從樹的根結點開始往下訪問一直到葉結點所經過的所有結點形成一條路徑。
列印出和與輸入整數相等的所有路徑。
例如 輸入整數22和如下二元樹
10
/ \
5 12
/ \
4 7
則列印出兩條路徑:10, 12和10, 5, 7
#include<stdio.h>#include<assert.h>#include<malloc.h>#define SUM 22typedef 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 leftbitree_sum(root->left,sum,i+1);x[i+1]=2;//to rightbitree_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;}