这是向该二叉树中插入字符数据,然后将其以垂直方式打印出来,最后将该树保存到文件中。
#include<stdio.h>
#include<stdlib.h>
#define NAMESIZE 32
#define FNAME "/tmp/out"
struct node_st//结构定义:节点结构
{
char data;//数组
struct node_st *l,*r;//左右指针
};
static struct node_st *tree = NULL;
//1.插入节点:递归函数
int insert(struct node_st**root,int data)
//参数:指向二叉树节点的指针的指针root,要插入的新节点的值
{
struct node_st *node;//根节点的类型
if(* root == NULL)//如果根节点为NULL
{
node = malloc(sizeof(*node));//创建一个新的节点并使它成为根节点:新的节点分配内存空间
if(node == NULL)//检查是否成功分配了内存
return -1;
node->data = data;//新节点的data为要插入的值
node->l = NULL;//新节点的左右子节点初始化为NULL
node->r = NULL;
*root = node;//原来的根节点指针现在指向新节点
return 0;//返回0,表示插入成功
}
//递归,用于在树中插入新节点
if(data <= (*root)->data)//如果数据小于等于当前节点的值
return insert(&(*root)->l,data);//调用insert函数向树的左子树插入新节点
else
return insert(&(*root)->r,data);
}
//2.画出树:二叉树的遍历操作,具体是中序遍历:左子树-根节点-右子树
void draw_(struct node_st *root,int level)
//参数:一个指向二叉树节点的指针root,和当前节点的遍历层级 level
{
if(root == NULL)
return ;
//当节点为空时,
//表示已经遍历到了树的底部,此时函数直接返回,不再继续调用自身。
draw_(root->l,level+1);//对左子树进行递归遍历,并在遍历过程中将层级加 1
for(int i = 0;i < level ; i++)//根:for 循环,循环次数是当前遍历层级level,也就是当前节点的缩进级别。
printf(" ");
printf("%c\n",root->data);//打印当前节点的数据
draw_(root->r,level+1);//对右子树进行递归遍历,并在遍历过程中将层级加 1
}
void draw(struct node_st *root)
{
draw_(root,0);//进入根节点,从第0层开始遍历
printf("\n\n");
//getchar();
}
//3.保存树:先序:根左右
int save_(struct node_st *root,FILE *fp)
//参数:指向二叉树节点的指针 root,另一个是文件指针 fp
{
fputc('(',fp);//fputc用来写入'('
/*if error*/
if(root == NULL)//如果节点为空,说明已经遍历到了树的底部
{
fputc(')',fp);//函数向文件中写入一个右括号字符 ')'
return 0;//并返回0表示保存成功
}
//如果当前节点不为空
fputc(root->data,fp);//将当前节点的数据(即 root->data)写入文件
/*if error*/
save_(root->l,fp);//函数递归地调用自身,先保存左子树
save_(root->r,fp);//保存右子树
fputc(')',fp);//完成所有子树的保存后,函数再次向文件中写入一个右括号字符 ')'
/*if error*/
return 0;//函数返回0表示保存成功
}
//
int save(struct node_st *root,const char *path)
{
//调用 fopen 函数来打开指定路径的文件,并以写入模式打开
FILE *fp;
fp = fopen(path,"w");
//文件打开成功,函数调用 save_ 函数来保存二叉树的结构到文件中
if(fp == NULL)
return -1;
save_(tree,fp);
return 0;
}
int main()
{
int i;
char arr[] = "cefadjbh";
//定义一棵树
for(i = 0;i < sizeof(arr)/sizeof(*arr)-1;i++)
{
insert(&tree,arr[i]);
}
draw(tree);
save(tree,FNAME);
exit(0);
}
代码运行显示
j
h
f
e
d
c
b
a
(c(a()(b()()))(e(d()())(f()(j(h()())()))))
从文件中读取二叉树并打印出二叉树的功能
#include<stdio.h>
#include<stdlib.h>
#define NAMESIZE 32
#define FNAME "/tmp/out"
struct node_st//结构定义:节点结构
{
char data;//数组
struct node_st *l,*r;//左右指针
};
static struct node_st *tree = NULL;
//1.插入节点:递归函数
int insert(struct node_st**root,int data)
//参数:指向二叉树节点的指针的指针root,要插入的新节点的值
{
struct node_st *node;//根节点的类型
if(* root == NULL)//如果根节点为NULL
{
node = malloc(sizeof(*node));//创建一个新的节点并使它成为根节点:新的节点分配内存空间
if(node == NULL)//检查是否成功分配了内存
return -1;
node->data = data;//新节点的data为要插入的值
node->l = NULL;//新节点的左右子节点初始化为NULL
node->r = NULL;
*root = node;//原来的根节点指针现在指向新节点
return 0;//返回0,表示插入成功
}
//递归,用于在树中插入新节点
if(data <= (*root)->data)//如果数据小于等于当前节点的值
return insert(&(*root)->l,data);//调用insert函数向树的左子树插入新节点
else
return insert(&(*root)->r,data);
}
//2.画出树:二叉树的遍历操作,具体是中序遍历:左子树-根节点-右子树
void draw_(struct node_st *root,int level)
//参数:一个指向二叉树节点的指针root,和当前节点的遍历层级 level
{
if(root == NULL)
return ;
//当节点为空时,
//表示已经遍历到了树的底部,此时函数直接返回,不再继续调用自身。
draw_(root->l,level+1);//对左子树进行递归遍历,并在遍历过程中将层级加 1
for(int i = 0;i < level ; i++)//根:for 循环,循环次数是当前遍历层级level,也就是当前节点的缩进级别。
printf(" ");
printf("%c\n",root->data);//打印当前节点的数据
draw_(root->r,level+1);//对右子树进行递归遍历,并在遍历过程中将层级加 1
}
void draw(struct node_st *root)
{
draw_(root,0);//进入根节点,从第0层开始遍历
printf("\n\n");
//getchar();
}
//3.保存树:先序:根左右
int save_(struct node_st *root,FILE *fp)
//参数:指向二叉树节点的指针 root,另一个是文件指针 fp
{
fputc('(',fp);//fputc用来写入'('
/*if error*/
if(root == NULL)//如果节点为空,说明已经遍历到了树的底部
{
fputc(')',fp);//函数向文件中写入一个右括号字符 ')'
return 0;//并返回0表示保存成功
}
//如果当前节点不为空
fputc(root->data,fp);//将当前节点的数据(即 root->data)写入文件
/*if error*/
save_(root->l,fp);//函数递归地调用自身,先保存左子树
save_(root->r,fp);//保存右子树
fputc(')',fp);//完成所有子树的保存后,函数再次向文件中写入一个右括号字符 ')'
/*if error*/
return 0;//函数返回0表示保存成功
}
//
int save(struct node_st *root,const char *path)
{
//调用 fopen 函数来打开指定路径的文件,并以写入模式打开
FILE *fp;
fp = fopen(path,"w");
//文件打开成功,函数调用 save_ 函数来保存二叉树的结构到文件中
if(fp == NULL)
return -1;
save_(tree,fp);
return 0;
}
int main()
{
int i;
char arr[] = "cefadjbh";
//定义一棵树
for(i = 0;i < sizeof(arr)/sizeof(*arr)-1;i++)
{
insert(&tree,arr[i]);
}
draw(tree);
save(tree,FNAME);
exit(0);
}
运行代码
j
h
f
e
d
c
b
a