实验要求
代码思想
首先创建随机的非完全10叉树,使用1-9表示节点的值,0表示空节点,将该完全10叉树存入文件中,后读文件创造出对应的二叉树并输出。
创建树代码
#include<stdio.h>
#include<stdlib.h>
#define TEN 10
#define MAXLEVEL 7
#define MaxSize 10000000
typedef struct tree{
int data;
int Level;
struct tree *children[TEN];
}tree;
//初始化队头和队尾指针开始时都为0
typedef struct queue{
struct tree* numQ[MaxSize];
int front;
int rear;
}Queue;
Queue Q;
void initilize() { //初始化队列
Q.front = 0;
Q.rear = 0;
}
void Push(struct tree* root) { //入队
Q.numQ[++Q.rear] = root;
}
struct tree* Pop() { //出队
return Q.numQ[++Q.front];
}
int empty() { //判断对列是否为空
return Q.rear == Q.front;
}
int num = 1;
void LevelOrderTraversal (struct tree* root) { //层次遍历用于查看树
struct tree *temp;
int NowLevel=root->Level;
Push(root);
while (!empty()) {
temp = Pop();
if(NowLevel!=temp->Level)
{
printf("\n");
NowLevel=temp->Level;
}
printf("%d ", temp->data); //输出队首结点
for (int i = 0; i < TEN; i++){
if(NowLevel<MAXLEVEL)
{
if(temp->children[i])
Push(temp->children[i]);
else
{
tree *NodeNULL;
NodeNULL=(tree*)malloc(sizeof(tree));
NodeNULL->data=0;
NodeNULL->Level=NowLevel+1;
for(int j=0;j<TEN;j++)
{
NodeNULL->children[j]=NULL;
}
Push(NodeNULL);
}
//break;
}
}
}
}
void preOrderTraversal (struct tree* root,int Level) { //前序遍历用于输出树
int RootLevel=Level;
if(root&&RootLevel<=MAXLEVEL)
{
printf("%d ",root->data);
FILE *fp=NULL;
if((fp=fopen("/Users/apple/Documents/Linuxhomework1/Ftree.txt", "a+"))!=NULL)
{
;
}
else
printf("can't open Ftree for write\n");
fprintf(fp,"%d ",root->data);
fclose(fp);
for(int i=0;i<TEN;i++)
{
preOrderTraversal(root->children[i],root->Level+1);
}
}
else if(RootLevel<=MAXLEVEL)
{
printf("0 ");
FILE *fp=NULL;
if((fp=fopen("/Users/apple/Documents/Linuxhomework1/Ftree.txt", "a+"))!=NULL)
{
;
}
else
printf("can't open Ftree for write\n");
fprintf(fp,"%d ",0);
fclose(fp);
}
else
{
;
}
}
tree *CreateTree(int Level)
{
int RandTEN;
int j=1;
tree *Node;
Node=(tree*)malloc(sizeof(tree));
//num=rand()%MaxSize;
num=rand()%9+1;
//printf("%d\n",num);
Node->data=num;
Node->Level=Level;
for(j=0;j<TEN;j++)
{
Node->children[j]=NULL;
}
RandTEN=rand()%TEN+1;//最小为1
if(Level<MAXLEVEL)
{
for(j=0;j<RandTEN;j++)
{
Node->children[j]=CreateTree(Level+1);
}
}
return Node;
}
int main()
{
tree *T;
initilize();
T=CreateTree(1);
printf("TreeDone\n");
preOrderTraversal(T,T->Level);
printf("predon");
return 0;
}
读树代码
#include<stdio.h>
#include<stdlib.h>
#define TEN 10
#define MAXLEVEL 7
#define MaxSize 10000000
typedef struct tree{
int data;
int Level;
struct tree *children[TEN];
}tree;
//初始化队头和队尾指针开始时都为0
typedef struct queue{
struct tree* numQ[MaxSize];
int front;
int rear;
}Queue;
Queue Q;
void initilize() { //初始化队列
Q.front = 0;
Q.rear = 0;
}
void Push(struct tree* root) { //入队
Q.numQ[++Q.rear] = root;
}
struct tree* Pop() { //出队
return Q.numQ[++Q.front];
}
int empty() { //判断对列是否为空
return Q.rear == Q.front;
}
void LevelOrderTraversal (struct tree* root) { //层次遍历用于查看树
struct tree *temp;
int NowLevel=root->Level;
Push(root);
while (!empty()) {
temp = Pop();
if(NowLevel!=temp->Level)
{
printf("\n");
NowLevel=temp->Level;
}
printf("%d ", temp->data); //输出队首结点
for (int i = 0; i < TEN; i++){
if(NowLevel<MAXLEVEL)
{
if(temp->children[i])
Push(temp->children[i]);
else
{
tree *NodeNULL;
NodeNULL=(tree*)malloc(sizeof(tree));
NodeNULL->data=0;
NodeNULL->Level=NowLevel+1;
for(int j=0;j<TEN;j++)
{
NodeNULL->children[j]=NULL;
}
Push(NodeNULL);
}
//break;
}
}
}
}
int number=0;
int flagfile=0;
FILE *fp=NULL;
tree *CreateTree(int Level)
{
tree *Node;
int data;
if(!flagfile)
{
flagfile=flagfile+1;
if((fp=fopen("/Users/apple/Documents/Linuxhomework1/Ftree.txt", "r"))!=NULL)
{
;
}
else
printf("can't open Ftree for write\n");
}
//fseek(fp, number*sizeof(int), 0);
number=number+1;
//printf("number=%d\n",number );
if(fscanf(fp,"%d ",&data)==EOF)
{
return Node;
}
if(data==0)
{
printf("0 ");
Node=NULL;
return Node;
}
else if(data!=0)
{
Node=(tree*)malloc(sizeof(tree));
Node->data=data;
printf("%d ",data);
Node->Level=Level;
for (int i = 0; i < TEN; i++)
{
Node->children[i] = CreateTree(Level+1);
}
}
}
int main()
{
tree *T;
initilize();
T=CreateTree(1);
printf("TreeDone\n");
//LevelOrderTraversal(T);
return 0;
}