数据结构二叉树程序代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构⼆叉树程序代码
#include
#include
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define MAX_TREE_SIZE 100//⼆叉树的最⼤结点
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
#define telemtype char
#define selemtype char
typedef telemtype sqbitree[MAX_TREE_SIZE];//0号单元储存根结点sqbitree bt;
typedef struct bitnode
{
telemtype data;
struct bitnode *lchild,*rchild;
}bitnode,*bitree;
bitree T;
typedef struct
{
bitree *base;
bitree *top;
int stacksize;
}sqstack;
sqstack s;
void menu();//菜单
void initstack(sqstack &s);//初始化
void clearstack(sqstack &s);//置空栈
void push(sqstack &s,bitnode e);//⼊栈
void pop(sqstack &s,bitnode e);//出栈
void gettop(sqstack &s);//取栈顶元素
int stackempty(sqstack s);//判断栈是否为空
void createbitree(bitree &T);//创建树
void traversetree(bitree T);//遍历树
void preordertraverse(bitree T);//先序遍历
void inordertraverse(bitree T);//中序遍历
void postordertraverse(bitree T);//后序遍历
int treedepth(bitree T);//求树深度
void treenature(bitree T);
//---------------------主函数----------------------
void main()
{
int a;
initstack(s);
for(;;)
{
menu();
printf("请输⼊要操作的数字\n");
scanf("%d",&a);
switch(a)
{
case 1:createbitree(T);break;
case 2:traversetree(T);break;
case 3:treenature(T);break;
case 4:exit(0);break;
default:printf("please input a number again!");
}
}
}
//---------------------⼦函数----------------------------
void menu()//菜单
{
printf("************菜单*************\n");
printf("********1、树的创建*********\n");
printf("********2、树的遍历*********\n");
printf("********3、树的属性*********\n");
printf("********4、退出*********\n");
}
void initstack(sqstack &s)//初始化
{
s.base=(bitree*)malloc(STACK_INIT_SIZE*sizeof(bitree));
if(!s.base)exit(OVERFLOW);
s.top=s.base;
s.stacksize=STACK_INIT_SIZE;
}
void clearstack(sqstack &s)//置空栈
{
s.top=s.base;
}
void push(sqstack &s,bitree e)//⼊栈
{
if(s.top-s.base>=s.stacksize)
{
s.base=(bitree*)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(bitree)); if(!s.base)exit(OVERFLOW);
s.top=s.base+s.stacksize;
s.stacksize+=STACKINCREMENT;
}
*s.top++=e;
}
void pop(sqstack &s,bitree &e)//出栈
{
if(s.top==s.base)
printf("栈为空!\n");
e=*--s.top;
}
void gettop(sqstack &s,bitree &e)//取栈顶元素
{
if(s.top==s.base)
printf("栈为空!\n");
e=*(s.top-1);
}
int stackempty(sqstack s)//判断栈为空
{
if(s.top==s.base)
return TRUE;
else return FALSE;
}
void createbitree(bitree &T)//创建树
{
telemtype ch;
telemtype a;
a=getchar();
scanf("%c",&ch);
if(ch=='#')
T=NULL;
else
{
if(!(T=(bitnode*)malloc(sizeof(bitnode))))
exit(OVERFLOW);
T->data=ch;
createbitree(T->lchild);
createbitree(T->rchild);
}
}
void traversetree(bitree T)//遍历树
{
int n,i;
for(i=0;i<4;i++)
{
printf("************树的遍历************\n");
printf("**********1、先序遍历***********\n"); printf("**********2、中序遍历***********\n"); printf("**********3、后序遍历***********\n"); printf("**********4、退出应⽤***********\n"); scanf("%d",&n);
switch(n)
{
case 1:preordertraverse(T);break;
case 2:inordertraverse(T);break;
case 3:postordertraverse(T);break;
case 4:printf("树的遍历已退出!\n");break; default:printf("输⼊有误,请重新输⼊!\n");
}
}
}
/*void preordertraverse(bitree T)//递归先序遍历{
if(T)
{
printf("%c",T->data);
preordertraverse(T->lchild); preordertraverse(T->rchild);
}
printf("\n");
}*/
void preordertraverse(bitree T)//⾮递归先序遍历{
sqstack s;
initstack(s);
bitree p;
p=T;
while(p||!stackempty(s))
{
if(p)
{
printf("%c",p->data);
p=p->lchild;
}
else p=p->rchild;
}
printf("\n");
}
/*void inordertraverse(bitree T)//递归中序遍历
{
if(T)
{
inordertraverse(T->lchild);
printf("%c",T->data);
inordertraverse(T->rchild);
printf("\n");
}
}*/
void inordertraverse(bitree T)//⾮递归中序遍历{
sqstack s;
initstack(s);
bitree p;
p=T;
while(p||!stackempty(s))
{
if(p)
{ push(s,p);
p=p->lchild;
}
else
{
pop(s,p);
printf("%c",p->data);
p=p->rchild;
}
}
printf("\n");
}
/*void postordertraverse(bitree T)//递归后序遍历{
if(T)
{
postordertraverse(T->lchild); postordertraverse(T->rchild);
printf("%c",T->data);
printf("\n");
}
}*/
void postordertraverse(bitree T)//⾮递归后序遍历{
bitree p;
initstack(s);
p = T;
int tag;
while(p||!stackempty(s))
{
if(p)
{
push(s,p);
tag=0;
p = p->lchild;
}
else
{
if(tag==1)
{
pop(s,p);
printf("%c",p->data);
p = NULL;
}
else
{
gettop(s,p);
tag=1;
p = p->rchild;
}
}
}
printf("\n");
}
int treedepth(bitree T)//求树深度
{
int depthall,depthl,depthr;
if(!T)
depthall = 0;
else
{
depthl=treedepth(T->lchild);
depthr=treedepth(T->rchild);
depthall=(depthl > depthr ? depthl:depthr)+1;
}
//printf("树的深度为:%d\n",depthall);
return depthall;
}
void treenature(bitree T)//树的结点数,叶⼦数,⼀度结点数,树的深度等属性。

{
int i,n;
int a[4] = {0};//a[0]结点数,a[1]叶⼦数,a[2]⼀度结点数,a[3]树的深度.
bitree p=T;
a[3] = treedepth(T);
while(p||!stackempty(s))
{
if(p)
{
if(!(p->lchild )&&!(p->rchild))
{
++a[1];
}
if(!(p->lchild) || !(p->rchild))
{
++a[2];
}
push(s,p);
p = p->lchild;
}
else
{
pop(s,p);
++a[0];
p = p->rchild;
}
}
for(i=0;i<5;i++)
{
printf("***********树的属
性**************\n");
printf("***********1、树的结点数**************\n");
printf("***********2、树的叶⼦树**************\n");
printf("***********3、树的⼀度结点数**************\n");
printf("***********4、树的深度**************\n");
printf("***********5、退出本层应⽤**************\n"); scanf("%d",&n);
switch(n)
{
case 1:printf("该树的结点有%d个\n",a[0]);break; case 2:printf("该树的叶⼦有%d个\n",a[1]);break; case 3:printf("该树的⼀度结点有%d个\n",a[2]);break; case 4:printf("该树的深度为%d\n",a[3]);break; case 5:printf("本层应⽤已退出\n");break; default:printf("输⼊有误,请重新输⼊!\n");
}
}
}。

相关文档
最新文档