将二叉树写入文件,再读出重新构建

来源:互联网 发布:淘宝助理5.5官方 编辑:程序博客网 时间:2024/06/16 16:09
代码如下:
/******************************* * * 功能:生成一棵二叉树,写进文件,再读出, *       并将其重构成一个二叉树 * * author:kangquan2008@scut  blog:http://blog.csdn.net/kangquan2008 * ******************************/#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAX_SIZE 20typedef struct Node{char data;struct Node * lchild;struct Node * rchild;}* Tree,Node;void create_tree(Tree * tree){int data,data2;data = fgetc(stdin);data2 = getc(stdin);// 吸收回车键,或用 getchar() :) 注意返回值是整数!if(data == 'z')// 遇到z结束{*tree = NULL;return ;}if(!(*tree = malloc(sizeof(Node))))exit(-1);(*tree)->data = data;create_tree(&((*tree)->lchild));create_tree(&((*tree)->rchild));}void pre_order_fun(Tree tree){if(tree == NULL)return ;printf("%c ",tree->data);pre_order_fun(tree->lchild);pre_order_fun(tree->rchild);}void in_order_fun(Tree tree){if(tree == NULL)return ;in_order_fun(tree->lchild);printf("%c ",tree->data);in_order_fun(tree->rchild);}void pre_order_file(Tree tree,FILE * file){if(tree == NULL)return ;printf("%c ",tree->data);fputc(tree->data,file);pre_order_file(tree->lchild,file);pre_order_file(tree->rchild,file);}void in_order_file(Tree tree,FILE * file){if(tree == NULL)return ;in_order_file(tree->lchild,file);printf("%c ",tree->data);fputc(tree->data,file);in_order_file(tree->rchild,file);}void get_from_file(char pre[],char in[],FILE * file){char all[MAX_SIZE * 2];rewind(file);fgets(all,sizeof(all),file);int i;for(i=0; i<strlen(all); i++){if(i < strlen(all)/2)pre[i] = all[i];else in[i-strlen(all)/2] = all[i];if(i == strlen(all)/2)pre[i] = '\0';}in[i-strlen(all)/2] = '\0';}void form_tree(char pre[],char in[],int len,Tree * tree){if(len > 0){char * p = in;for(; p!= NULL; p++)if(*p == *pre)break;int left_size = p - in;*tree = malloc(sizeof(Node));(*tree)->data = *pre;(*tree)->lchild = NULL;(*tree)->rchild = NULL;form_tree(pre+1,in,left_size,&((*tree)->lchild));form_tree(pre+left_size+1,p+1,len-left_size-1,&((*tree)->rchild));}}int main(){Tree tree = NULL;create_tree(&tree);FILE * file;file = fopen("./test.txt","w+");if(file == NULL){printf("can not open!");exit(EXIT_FAILURE);}pre_order_file(tree,file);in_order_file(tree,file);puts("");char pre[MAX_SIZE] ;//= "1234567";char in[MAX_SIZE] ;//= "3241657";get_from_file(pre,in,file);puts(pre);puts(in);Tree target_tree = NULL;form_tree(pre,in,strlen(pre),&target_tree);pre_order_fun(target_tree);in_order_fun(target_tree);return 0;}/*123zz4zz56zz7zz按上面的输入,即可生成下面的树,写入文件并读出重新构建       1     2    5   3  4  6  7*/

原创粉丝点击