树转存广义表实例(保姆版)

这是向该二叉树中插入字符数据,然后将其以垂直方式打印出来,最后将该树保存到文件中。

#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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值