树及其应用 C语言实现

数据结构实验 树及其应用 C语言实现

树的定义
树(tree)是包含n(n>=0)个结点的有穷集,其中:
(1)每个元素称为结点(node);
(2)有一个特定的结点被称为根结点或树根(root)。
(3)除根结点之外的其余数据元素被分为m(m≥0)个互不相交的集合T1,T2,……Tm-1,其中每一个集合Ti(1<=i<=m)本身也是一棵树,被称作原树的子树(subtree)。
树也可以这样定义:树是由根结点和若干颗子树构成的。树是由一个集合以及在该集合上定义的一种关系构成的。集合中的元素称为树的结点,所定义的关系称为父子关系。父子关系在树的结点之间建立了一个层次结构。在这种层次结构中有一个结点具有特殊的地位,这个结点称为该树的根结点,或称为树根。

实验内容

  1. 输入字符序列,建立二叉树。
  2. 按先序、中序、后序遍历二叉树。
  3. 按某种形式(先序、中序、后序)输出整棵二叉树。
  4. 求二叉树的高度。
  5. 求二叉树的叶子结点个数。
  6. 交换二叉树的左右子树
  7. 在主函数中设计一个简单的菜单,分别调用上述算法。

具体代码如下:
#include<stdio.h>
#include<stdlib.h>
int m,n,k;
typedef struct node {
int data;
struct node *lchild,*rchild;
}Bnode;

Bnode *creat(){
int i,j;
char x;
Bnode *q,*s[20];
Bnode *t=NULL;
printf("\n 请依此输入节点位置与值:");
scanf("%d,%c",&i,&x);
while((i!=0) && (x!=‘0’)){
q=(struct node *)malloc(sizeof(struct node));
q->data=x;
q->lchild=NULL;
q->rchild=NULL;
s[i]=q;
if(i==1) t=q;
else{
j=i/2;
if((i%2)==0) s[j]->lchild=q;
else s[j]->rchild=q;}
printf("\n 请依此输入节点位置与值:");
scanf("%d,%c",&i,&x); }
return t;}

//中序遍历
void middleorder(Bnode *p){
if(p!=NULL){
middleorder(p->lchild);
printf("%6c",p->data);
middleorder(p->rchild);
}
}

//先序遍历
void fstorder(Bnode *p){
if(p!=NULL){
printf("%6c",p->data);
fstorder(p->lchild);
fstorder(p->rchild);
}
}

//后序遍历
void lastorder(Bnode *p){
if(p!=NULL){
lastorder(p->lchild);
lastorder(p->rchild);
printf("%6c",p->data);
}
}

//叶子节点总数
int leafnum(Bnode *p){
if(p!=NULL){
if(p->lchildNULL && p->rchildNULL)
m++;
leafnum(p->lchild);
leafnum(p->rchild);
} return m;
}

//树高
int depth(Bnode *p){
if(p==NULL) return 0;
else {
int dl=depth(p->lchild);
int dr=depth(p->rchild);
return 1+(dl>dr?dl:dr);
}
}

//交换左右子树
void exchange(Bnode *p){
if(p!=NULL){
Bnode *q;
q=p->lchild;
p->lchild=p->rchild;
p->rchild=q;
printf("%6c",p->data);
exchange(p->lchild);
exchange(p->rchild);

}
}
void main()
{ char ch;
int k,n,dep;
Bnode *t;
do{ printf("\n\n\n");
printf("\n\n 1.建立二叉树");
printf("\n\n 2.先序、中序、后序遍历二叉树");
printf("\n\n 3.计算二叉树中叶子结点的个数");
printf("\n\n 4.求二叉树的树高");
printf("\n\n 5.交换左右二叉树");
printf("\n\n 6.结束运行");
printf("\n");
printf("\n 请输入您的选择:");
scanf("%d",&k);
switch(k){
case 1: printf(“结束时请输入0,0\n”);t=creat();break;
case 2:{printf(“先序遍历二叉树结果:\n”);
fstorder(t);printf("\n");
printf(“中序遍历二叉树结果:\n”);
middleorder(t);printf("\n");
printf(“后序遍历二叉树结果:\n”);
lastorder(t);
ch=getch();} break;
case 3:{n=leafnum(t);
printf("\n二叉树叶子节点个数为:%d",n);
ch=getch();}break;
case 4:{dep=depth(t);
printf("\n二叉树的树高为:%d",dep);
ch=getch();}break;
case 5:{printf(“交换左右二叉树结果:\n”);
exchange(t);ch=getch();}break;
case 6:exit(0);
}
}while(k>=1 && k<6);
ch=getch();
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

樱吹雪、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值