普通二叉树及其树形



#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
typedef struct tree{
    char data;
    struct tree *lchild,*rchild;
}TREE;
TREE*createbitree()//建立二叉树
{
char ch;
TREE *p;
scanf(" %c",&ch);
if (ch=='#')
p=NULL;
else
{
p=(TREE *)malloc(sizeof(TREE));
p->data=ch;
p->lchild=createbitree();
p->rchild=createbitree();
}
return p;
}
void tiaozheng(TREE *p)
{
if(isprint(p->data))
printf("%c",p->data);
else
printf("<%02d>",p->data);
}
void shu(TREE *p,int len)//数的形状
{
int i=0;
if (p!=NULL)
{
shu(p->rchild,len+1);
for (i=1;i<=4*len;i++)
printf("%c",i%4-1?' ':'|');
tiaozheng(p);
if(!isprint(p->data))
printf("+<\n");
else
printf(">--+<\n");
shu(p->lchild,len+1);
}
}
void order(TREE *p,int a)//a=1前序遍树,a=2中序遍树,a=3后序遍树a=4释放树
{
if (p!=NULL)
{
if(a==1)
            tiaozheng(p);
order(p->lchild,a);
if(a==2)
            tiaozheng(p);
order(p->rchild,a);
if(a==3)
            tiaozheng(p);
if(a==4)
{
free(p);
p=NULL;
}
}
}
int shendu(TREE *p)//树算深度
{
int l,r;
if (p==NULL)
return 0;
l=shendu(p->lchild)+1;
r=shendu(p->rchild)+1;
return l>=r?l:r;
}
int dianshu(TREE *p)//算点数
{
if (!p)
return 0;
return dianshu(p->lchild)+dianshu(p->rchild)+1;
}
void jiemian()//操作界面
{
printf("=========================\n");
printf("* 1.新建二叉树\n");
printf("* 2.输出树的深度和叶子点数\n");
printf("* 3.前,中,后序遍历二叉树\n");
    printf("* 4.执行1,2,3选项\n");
printf("* 5.释放指针,安全退出\n");
printf("=========================\n");
}
void main()
{
TREE *p=NULL;
int len=0,c=0,i;
char cha[][3]={"前","中","后"};
do{
system("cls");
printf("①--②--③--④--⑤--⑥--⑦--⑧--⑨--⑩--①--②--③--④--⑤\n");
shu(p,len);
jiemian();
while(c>5||c<1)
{
printf("请输入(1--5):");
scanf("%d",&c);
while(getchar()!='\n');
}
if(c==5||c==1&&p)
order(p,4);
if(c==1)
{
printf("注:暂不支持汉字录入(#表示空指针)按前序输入:\n");
p=createbitree();
printf("输入完毕\n");
while(getchar()!='\n');
}
if(c==2||c==4)
printf("深度:%d\n点数:%d\n",shendu(p),dianshu(p));
if(c==3||c==4)
for(i=0;i<3;i++)
{
printf("%s序遍树",cha[i]);
order(p,i+1);
printf("\n");
}
i=c;c=0;
system("pause");
}while(i!=5);
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值