提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
`
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;
}
}
总结
提示:二叉树的详细建立步骤,以及子系统详解,点进我的主页查看更多
我是你们的学长,喜欢就关注我,更多的干货都在我的主页,全部免费