C语言数据结构,二叉树子系统

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

`

C语言数据结构,二叉树子系统,点开我的主页有详细介绍,喜欢的话就点赞,收藏,加关注,我是你们的学长


`

一、二叉树子系统

1.实验目的

实验目的:
1.掌握二叉树的特点及其存储方式。
2.掌握二叉树的创建和显示方法。
3.复习二叉树遍历的概念、掌握二叉树遍历的基本方法。
4.掌握求二叉树的叶结点数、总结点数和深度等基本算法。

2.实验的内容及步骤

1.按屏幕提示用前序方法建立一棵二叉树。
2.编写前序遍历、中序遍历、后序遍历程序。
3.编写求二叉树的叶结点数、总结点数和深度的程序。
4.设计一个选择式菜单,以菜单方式选择上述的各种基本操作。

完成
1-------建二叉树
2-----先序遍历
3-------中序遍历
4-------后序遍历
5-------求叶子数
6-------求结点数
7—求树深度
8—返回

3.代码如下


``#include<stdio.h>
#include<malloc.h>
#define TREEMAX 100

typedef struct BT
{
	char data ;
	struct BT *lchild;
	struct BT *rchild;
}BT;

BT *CreateTree();
void ShowTree(BT *T);
void Preorder(BT *T);
void Postorder(BT *T);
void Levelorder(BT *T);
void Inorder(BT *T);
void Leafnum(BT *T,int *count);
void Nodenum(BT *T);
int TreeDepth(BT *T);

int count=0;


int n=0;
 main()
{
	BT *T=NULL;
	int count1=0;
	int ch1,ch2,a;	
	ch1=1;
	while(ch1)
	{
	printf("\n");
    printf("\n\t\t               二叉树子系统                 ");
	printf("\n\t\t********************************************");
		printf("\n\t\t*          1-------建 二 叉 树             *");
        printf("\n\t\t*          2-------凹 入 显 示             *");
		printf("\n\t\t*          3-------先 序 遍 历             *");
		printf("\n\t\t*          4-------中 序 遍 历             *");
		printf("\n\t\t*          5-------后 序 遍 历             *");
		printf("\n\t\t*          6-------层 次 遍 历             *");
		printf("\n\t\t*          7-------求 叶 子 数             *");
		printf("\n\t\t*          8-------求 结 点 数             *");
		printf("\n\t\t*          9-------求 树 深 度             *");		
		printf("\n\t\t*          0-------返       回             *");
		printf("\n\t\t********************************************");
		printf("\n\t\t请选择菜单号(0—9):");
		scanf("%d",&ch2);
		getchar();
		printf("\n");
		switch(ch2)
		{
		case 1:
			printf("\n\t\t说明:输入结点('0'表示后继结点为空)后按回车.\n");
			printf("\n\t\t请输入根结点:");
			T=CreateTree();
			printf("\n\t\t二叉树成功建立!\n");
			break;
		case 2:
			ShowTree(T);
			break;	
		case 3:
			printf("\n\t\t该二叉树的先序序列为:\n\t\t");
			Preorder(T);			
           	break;   
		case 4:
			printf("\n\t\t该二叉树的中序序列为:\n\t\t");
			Inorder(T);			
			break;
		case 5:
			printf("\n\t\t该二叉树的后序序列为:\n\t\t");
			Postorder(T);			
			break;
		case 6:
			printf("\n\t\t该二叉树的层次遍历序列为:\n\t\t");
			Levelorder(T);			
			break;
	    case 7:
			Leafnum(T,&count1);
			printf("\n\t\t该二叉树有%d个叶子.\n",count1);			
			break;
		case 8:
			count=0;
			Nodenum(T);
			printf("\n\t\t该二叉树有%d个结点.\n",count);
			break;
		case 9:
			printf("\n\t\t该树的深度是:%d.",TreeDepth(T));
			break;
		case 0:
			ch1=0;
			break;
		default: 
			printf("\n\t\t***请注意:输入有误!***");
		}

	   if(ch2)
	   {
  	    	printf("\n\t\t按回车键返回主菜单继续,按任意键退出.\n");
		    a=getchar();
	    	if(a!='\xA')
			{
				getchar();
				ch1=0;
			}
	   } 
	}

}
BT *CreateTree()                //建立二叉树
{
	BT *t;
	char x;
	scanf("%c",&x);
	getchar();
	if(x=='0')
		t=NULL;
	else
	{
		t=(BT*)malloc(sizeof(BT));
		t->data=x;
		printf("\n\t\t请输入%c结点的左子结点:",t->data);
		t->lchild=CreateTree();
		printf("\n\t\t请输入%c结点的右子结点:",t->data);
		t->rchild=CreateTree();
	}
	return t;

}


void ShowTree(BT *T)          //凹入法显示二叉树
{
	BT *stack[TREEMAX],*p;
	int level[TREEMAX][2],top,n,i,width=4;
	if(T!=NULL)
	{
		printf("\n\t\t凹入表示法:\n\t\t");
		top=1;
		stack[top]=T;
		level[top][0]=width;
		while(top>0)
		{
			p=stack[top];
			n=level[top][0];
			for(i=1;i<=n;i++)
				printf("  ");
			printf("%c",p->data);
			for(i=n+1;i<30;i+=2)
				printf("=");
			printf("\n\t\t");
			top--;
			if(p->rchild!=NULL)
			{
				top++;
				stack[top]=p->rchild;
				level[top][0]=n+width;
			//	level[top][1]=2;
			}
			if(p->lchild!=NULL)
			{
				top++;
				stack[top]=p->lchild;
				level[top][0]=n+width;
			//	level[top][1]=1;
			}
		}
	}
	else
		printf("\t\t此树为空树!");

}
void Preorder(BT *T)          //先序遍历
{
	if(T)
	{  
		printf("%3c",T->data);	
		Preorder(T->lchild);
		Preorder(T->rchild);
	}
}


void Postorder(BT *T)         //后序遍历
{
	if(T)
	{		
		Postorder(T->lchild);
		Postorder(T->rchild);
		printf("%3c",T->data);	
	}
}

void Inorder(BT *T)           //中序遍历
{
	if(T)
	{
		Inorder(T->lchild);		
		printf("%3c",T->data);		
		Inorder(T->rchild);
	}
}


/*void Levelorder(BT *T)        //层次遍历
{
	int i,j;
	BT *q[100],*p;
	p=T;
	if(p!=NULL)
	{
		i=1;q[i]=p;j=2;//i指队头元素下标,j指队尾后面的空单元 
	}
	while(i!=j)
	{
		p=q[i];
		printf("%3c",p->data);
		if(p->lchild!=NULL)
		{
			q[j]=p->lchild;j++;
		}
		if(p->rchild!=NULL)
		{
			q[j]=p->rchild;j++;
		}
		i++;
	}
}
*/ 
void Levelorder(BT *T)        //层次遍历
{
	int i=0,j=0;// i指队头一元素,j指队尾元素
	BT *q[TREEMAX],*p;
	p=T;
	if(p!=NULL)
	{
		j++;q[j]=p;//根结点地址入队 
	}
	while (i!=j)//队列不为空 
	{
		i++;
		p=q[i]; //出队 
		printf("%3c",p->data);
		if(p->lchild!=NULL)
		{
		j++;	q[j]=p->lchild;  //出队元素结点的左孩子结点入队 
		}
		if(p->rchild!=NULL)
		{
		j++;	q[j]=p->rchild;//出队元素结点的右孩子结点入队 
		}
		
	}	 
}
void Leafnum(BT *T,int *count)           //求叶子数
{
	if(T)
	{
		if(T->lchild==NULL&&T->rchild==NULL)
			(*count)++;
		Leafnum(T->lchild,count);
		Leafnum(T->rchild,count);
	}
}


void Nodenum(BT *T)           //求结点数
{
	if(T)
	{
		count++;
		Nodenum(T->lchild);
		Nodenum(T->rchild);
	}
}


int TreeDepth(BT *T)          //求树深度
{
	int ldep,rdep;
	if(T==NULL)
		return 0;
	else
	{
		ldep=TreeDepth(T->lchild);
		rdep=TreeDepth(T->rchild);
	    if(ldep>rdep)
			return ldep+1;
		else
			return rdep+1;
	}
}

总结

提示:二叉树的详细建立步骤,以及子系统详解,点进我的主页查看更多
我是你们的学长,喜欢就关注我,更多的干货都在我的主页,全部免费

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值