寒假作业2024.2.7

本文详细介绍了如何使用C语言实现二叉树的创建、先序、中序和后序遍历,以及计算二叉树中不同度数节点的数量和树的深度。
摘要由CSDN通过智能技术生成

1请编程实现二又树的操作
1.1二又树的创建
1.2二又树的先序遍历
1.3二又树的中序遍历
1.4二又树的后序遍历
1.5二又树各个节点度的个数
1.6二叉树的深度

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <unistd.h>
typedef char datatype;

typedef struct Node
{
	datatype data;//数据域
	struct Node *l;//左孩子
	struct Node *r;//右孩子
}*Btree;
//创建节点
Btree create()
{
	Btree s=(Btree)malloc(sizeof(struct Node));
	if(s==NULL)
	return NULL;
	s->data='\0';
	s->l=NULL;
	s->r=NULL;
	return s;
}
//创建树和插入数据
Btree create_tree()
{
	datatype element;
	printf("please enter element:");
	scanf(" %c",&element);
	if(element=='#')
	{
		return NULL;
	}
	//创建根结点
	Btree tree=create();
	tree->data=element;
	//创建左孩子
	puts("左");
	tree->l=create_tree();
	//创建右孩子
	puts("右");
	tree->r=create_tree();
	//返回主函数
	return tree;
}
//先序遍历输出
void firstoutput(Btree tree)
{
	if(tree==NULL)
		return;
	//输出根
	printf("%c",tree->data);
	//遍历输出左孩子
	firstoutput(tree->l);
	//遍历输出右孩子
	firstoutput(tree->r);
}
//中序遍历输出
void midoutput(Btree tree)
{
	if(tree==NULL)
		return;
	//遍历输出左孩子
	firstoutput(tree->l);
	//输出根
	printf("%c",tree->data);
	//遍历输出右孩子
	firstoutput(tree->r);
}
//后序遍历输出
void lastoutput(Btree tree)
{
	if(tree==NULL)
		return ;
	//遍历输出左孩子
	firstoutput(tree->l);
	//遍历输出右孩子
	firstoutput(tree->r);
	//输出根
	printf("%c",tree->data);
}
//二叉树的各个度的节点个数
void count(Btree tree,int *n0,int *n1,int *n2)
{
	if(tree==NULL)
	return ;
	
	if(!tree->l && !tree->r)
		++*n0;
	else if(tree->l && tree->r)
		++*n2;
	else
		++*n1;
	//遍历左孩子
	count(tree->l,n0,n1,n2);
	//遍历右孩子
	count(tree->r,n0,n1,n2);
}
//计算树深度
int high(Btree tree)
{
	if(tree==NULL)
		return 0;
	//计算左深度
	int left=1+high(tree->l);
	//计算右深度
	int right=1+high(tree->r);
	if(left>right)
		return left;
	else
		return right;
}

int main(int argc, const char *argv[])
{
	//创建二叉树
	Btree tree=create_tree();
	//先序遍历
	printf("先序遍历\n");
	firstoutput(tree);
	puts("");
	//中序遍历输出
	printf("中序遍历\n");
	midoutput(tree);
	puts("");
	//后序遍历输出
	printf("后序遍历\n");
	lastoutput(tree);
	puts("");
	//二插树各个度的结点个数
	int n0=0,n1=0,n2=0;
	count(tree,&n0,&n1,&n2);
	printf("n0=%d n1=%d n2=%d sum=%d\n",n0,n1,n2,n0+n1+n2);
	//计算树的深度
	int len=high(tree);
	printf("二叉树深度为%d\n",len);
	return 0;
}

现象展示: 

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值