C语言实现二叉树链式存储

前序遍历创建树:

​

bitree *creatbitree()//前序遍历的数值来创建树——递归 
{
	char ch;
	bitree *root;
	ch=getchar();//用于接收输入的数值 
	if(ch=='*') return NULL;//用*来判断是否为空 
	else{
		root=(bitree *)malloc(sizeof(bitree));
		root->data=ch;//赋值 
		root->lchild=creatbitree();//左子树 
		root->rchild=creatbitree();//右子树 
	}
	return root;
}

[点击并拖拽以移动]
​

测量树的深度:

int depthbitree(bitree *T)//测量树的深度 
{
	if(T==NULL) return 0;
	else{
		int leftheighter=depthbitree(T->lchild);
		int rightheighter=depthbitree(T->rchild);
		return (leftheighter > rightheighter?leftheighter+1:rightheighter+1);
	}
}

计算树的叶子和总结点数 :

int leaf_count(bitree *T)//测量叶子的数量 
{
	if(T==NULL) return 0;
	else if(!T->lchild&&!T->rchild)//如果左右结点都为空则他就是叶子结点 
	return 1;
	else return leaf_count(T->lchild)+leaf_count(T->rchild);
}
int countbitree(bitree *T)//测量总的结点个数
{
	if(T==NULL)
	return 0;
	else{
		return 1+countbitree(T->lchild)+countbitree(T->rchild);
	}
}

前序、中序、后续遍历输出:

int preorder(bitree *T)//前序遍历序列 (根左右) 
{
	if(T==NULL)
	return 0;
	else{
		printf("%c  ",T->data);//先输出根节点 
		preorder(T->lchild);
		preorder(T->rchild);
	}
}
int inorder(bitree *T)//中序遍历序列 (左根右) 
{
	if(T==NULL)
	return 0;
	else{
		inorder(T->lchild);//先输出左孩子 
		printf("%c  ",T->data);
		inorder(T->rchild);
	}
}
int postorder(bitree *T)//后序遍历序列 (左右根) 
{
	if(T==NULL)
	return 0;
	else{
		postorder(T->lchild);//先输出左孩子 
		postorder(T->rchild);
		printf("%c  ",T->data);
	}
} 

广义表形式输出:

void displaybitree(bitree *T)//广义表输出 
{
	if (T == NULL) return;
	printf("%c", T->data);
	if (T->lchild == NULL && T->rchild == NULL)//判断是否是叶子节点 
		return;
	printf("(");
	displaybitree(T->lchild);
	printf(",");
	displaybitree(T->rchild);
	printf(")");
	return;
}

删除树

bitree *Delete(bitree *T)//删除树 
{
	if(T->lchild)
	Delete(T->lchild);
	else if(T->rchild)
	Delete(T->rchild);
	else
	free(T);
}

 完整代码如下:

#include"stdio.h"
#include"stdlib.h"
typedef int datatype;
typedef struct innode
{
	datatype data;
	struct innode *lchild,*rchild;
}bitree;
	int i,j;
bitree *creatbitree()//前序遍历的数值来创建树——递归 
{
	char ch;
	bitree *root;
	ch=getchar();//用于接收输入的数值 
	if(ch=='*') return NULL;//用*来判断是否为空 
	else{
		root=(bitree *)malloc(sizeof(bitree));
		root->data=ch;//赋值 
		root->lchild=creatbitree();//左子树 
		root->rchild=creatbitree();//右子树 
	}
	return root;
}


int depthbitree(bitree *T)//测量树的深度 
{
	if(T==NULL) return 0;
	else{
		int leftheighter=depthbitree(T->lchild);
		int rightheighter=depthbitree(T->rchild);
		return (leftheighter > rightheighter?leftheighter+1:rightheighter+1);
	}
}
int leaf_count(bitree *T)//测量叶子的数量 
{
	if(T==NULL) return 0;
	else if(!T->lchild&&!T->rchild)//如果左右结点都为空则他就是叶子结点 
	return 1;
	else return leaf_count(T->lchild)+leaf_count(T->rchild);
}
int countbitree(bitree *T)//测量总的结点个数
{
	if(T==NULL)
	return 0;
	else{
		return 1+countbitree(T->lchild)+countbitree(T->rchild);
	}
}
bitree *copy(bitree *T)//复制树 
{
	if(T==NULL)
	return NULL;
	else{
	bitree *temp;
	temp=(bitree *)malloc(sizeof(bitree));
	temp->data=T->data;
	temp->lchild=copy(T->lchild);
	temp->rchild=copy(T->rchild);
	return temp;
	}
}
int preorder(bitree *T)//前序遍历序列 (根左右) 
{
	if(T==NULL)
	return 0;
	else{
		printf("%c  ",T->data);//先输出根节点 
		preorder(T->lchild);
		preorder(T->rchild);
	}
}
int inorder(bitree *T)//中序遍历序列 (左根右) 
{
	if(T==NULL)
	return 0;
	else{
		inorder(T->lchild);//先输出左孩子 
		printf("%c  ",T->data);
		inorder(T->rchild);
	}
}
int postorder(bitree *T)//后序遍历序列 (左右根) 
{
	if(T==NULL)
	return 0;
	else{
		postorder(T->lchild);//先输出左孩子 
		postorder(T->rchild);
		printf("%c  ",T->data);
	}
} 
void displaybitree(bitree *T)//广义表输出 
{
	if (T == NULL) return;
	printf("%c", T->data);
	if (T->lchild == NULL && T->rchild == NULL)//判断是否是叶子节点 
		return;
	printf("(");
	displaybitree(T->lchild);
	printf(",");
	displaybitree(T->rchild);
	printf(")");
	return;
}
bitree *Delete(bitree *T)//删除树 
{
	if(T->lchild)
	Delete(T->lchild);
	else if(T->rchild)
	Delete(T->rchild);
	else
	free(T);
}
main()
{
	bitree *T;
	T=(bitree *)malloc(sizeof(bitree));
	T->lchild=NULL;
	T->rchild=NULL;
	puts("请输入树的前序遍历序列");
	T=creatbitree();
	int n=depthbitree(T);
	int m=leaf_count(T);
	int l=countbitree(T);
	puts("树创建完成"); 
	puts("前序输出为");
	printf("\t\t"); 
	preorder(T);
	puts("\n中序输出为");
	printf("\t\t");
	inorder(T);
	puts("\n后序输出为");
	printf("\t\t");
	postorder(T);
	puts("\n广义表输出");
	printf("\t\t");
	putchar('(');
	displaybitree(T);
	printf("\n高度%d\n叶子%d\n总结点%d\n",n,m,l);
	Delete(T);
	puts("删除成功");  
}

 

 

 

  • 12
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值