33,311
社区成员
发帖
与我相关
我的任务
分享
#include<iostream>
#include<string>
using namespace std;
#define MAXLEN 100
typedef struct bt //定义二叉树结构体
{
char data;
bt* lchild;
bt* rchild;
}bt;
bt *createBt(void);
void showTree(bt *t);
void preorder(bt *t);
void postorder(bt *t);
void levelorder(bt *t);
void inorder(bt *t);
int leafnum(bt *t);
int nodenum(bt *t);
int treeDepth(bt *t);
void printTree(bt *t);
int count;//定义计算结点个数的变量
int main() //树子系统主函数
{
bt *t=NULL;
char ch1,ch2,a;
ch1='y';
while(ch1=='y'||ch1=='Y')
{
printf("\n\n\n\n");
printf("\t\t\t 二叉树子系统\n");
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* x-------打印二叉树 *");
printf("\n\t\t* 0-------返 回 *");
printf("\n\t\t************************************");
printf("\n\n\t\t请选择菜单号(0--9):");
cin>>ch2;
switch(ch2)
{
case '1':
printf("\n\t\t请输入按先序建立二叉树的结点序列:");
printf("\n\t\t说明:‘00’代表后继结点为空,逐个输入,按回车输入下一结点。");
printf("\n\t\t请输入根结点:");
t=createBt();
printf("\n\t\t二叉树成功建立!\n");break;
case '2':showTree(t);break;
case '3':
printf("\n\t\t该二叉树的先序遍历序列为:");
preorder(t);break;
case '4':
printf("\n\t\t该二叉树的中序遍历序列为:");
inorder(t);break;
case '5':
printf("\n\t\t该二叉树的后序遍历序列为:");
postorder(t);break;
case '6':
printf("\n\t\t该二叉树的层次遍历序列为:");
levelorder(t);break;
case '7':
count=0;leafnum(t);
printf("\n\t\t该二叉树有%d个叶子。\n",count);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 'x':cout<<"\n\t\t该二叉树为:";printTree(t);break;
case '0':
ch1='n';break;
default:
printf("\n\t\t***请注意:输入有误!***");
}
if(ch2!='0')
{
printf("\n\n\t\t按回车键继续,按任意键返回主菜单!\n");
a=getchar();
if(a!='\xA')//??????????????
{ getchar(); ch1='n'; }
}
}
return 1;
}
bt *createBt(void) //建立二叉树
{
bt *t=NULL;
char x;
cin>>x;
getchar();//接受回车符
if(x!='#')
{
t=new bt;
t->data=x;
printf("\n\t\t请输入%c结点的左子结点:",t->data);
t->lchild=createBt();
printf("\n\t\t请输入%c结点的右子结点:",t->data);
t->rchild=createBt();
}
else t=NULL;
return t;
}
void preorder(bt *t) //先序遍历
{
if(t)
{
cout<<t->data;
preorder(t->lchild);
preorder(t->rchild);
}
}
void inorder(bt *t) //中序遍历
{
if(t)
{
inorder(t->lchild);
cout<<t->data;
inorder(t->rchild);
}
}
void postorder(bt *t) //后序遍历
{
if(t)
{
postorder(t->lchild);
postorder(t->rchild);
cout<<t->data;
}
}
void levelorder(bt *t) //层次遍历????????????????????
{
int i,j;
bt *q[100],*p;
p=t;
if(p!=NULL)
{ i=1; q[i]=p; j=2; }
while(i!=j)
{
p=q[i];
cout<<p->data;
if(p->lchild!=NULL)
{ q[j]=p->lchild; j++;}
if(p->rchild!=NULL)
{ q[j]=p->rchild; j++; }
i++;
}
}
int leafnum(bt *t) //求叶结点数
{
if(t)
{
if(t->lchild==NULL && t->rchild==NULL)
count++;
leafnum(t->lchild);
leafnum(t->rchild);
}
return count;
}
int nodenum(bt *t) //求二叉树总结点数
{
if(t)
{
count++;
nodenum(t->lchild);
nodenum(t->rchild);
}
return count;
}
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;
}
}
void showTree(bt *t) //凹入法显示二叉树?????
{
bt *stack[MAXLEN],*p;
int level[MAXLEN][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++) //n为显示宽度,字符以右对齐显示
printf(" ");
cout<<p->data;
for(i=n+1;i<50;i+=2)
printf("▃");
printf("\n\t\t");
top--;
if(p->rchild!=NULL) //左子树根结点入栈
{
top++;
stack[top]=p->rchild;
level[top][0]=n+width; //显示宽度增加width
level[top][1]=2; //左子树根结点入栈
}
if(p->lchild!=NULL) //右子树根结点入栈????????????
{
top++;
stack[top]=p->rchild;
level[top][0]=n+width; //显示宽度增加width
level[top][1]=2; //左子树根结点入栈
}
}
}
}
void printTree(bt *t){
if(t){
cout<<t->data;
if(t->lchild||t->rchild)
cout<<"(";
printTree(t->lchild);
if(t->lchild && t->rchild)
cout<<",";
printTree(t->rchild);
if(t->lchild || t->rchild)
cout<<")";
}
}