问题描述:
建立二叉树,对二叉树求叶子树和层数,进行中序递归和非递归遍历,和层序遍历,以及先序和后序递归遍历。
源代码:
#include"stdio.h"
#include"stdlib.h"
#define MAXSIZE 30
typedef struct BiThTree
{
char data;
struct BiThTree *lchild,*rchild;
}BiTreeNode;
int ye;
void InitBiTree(BiTreeNode **Bt)
{
*Bt=(BiTreeNode *)malloc(sizeof(BiTreeNode));
(*Bt)->lchild=(*Bt)->rchild=NULL;
}
BiTreeNode *CreatBiTree(BiTreeNode **Bt,char *tr)
{
BiTreeNode *p[MAXSIZE],*q=NULL;
int i=0,k;
int top=-1;
*Bt=NULL;
while(tr[i]!='/0')
{
switch(tr[i])
{
case'(':
k=1;//对左孩子进行操作
top++;
p[top]=q;
break;
case')':
top--;
break;
case',':
k=2;
break;
default:
q=(BiTreeNode *)malloc(sizeof(BiTreeNode));
q->data=tr[i];
q->lchild=q->rchild=NULL;
if(*Bt==NULL)
*Bt=q;
else if(k==1)
p[top]->lchild=q;
else if(k==2)
p[top]->rchild=q;
break;
}
i++;
}
return *Bt;
}
//按中序遍历二叉树 递归算法
int InorderBiTree(BiTreeNode *Bt)
{
BiTreeNode *p=Bt;
if(p==NULL)
return 0;
else
{
InorderBiTree(p->lchild);
printf("%c ",p->data);
InorderBiTree(p->rchild);
}
return 1;
}
int PreorderBiTree(BiTreeNode *Bt)
{
BiTreeNode *p=Bt;
if(p!=NULL)
{
printf("%c",p->data);
PreorderBiTree(p->lchild);
PreorderBiTree(p->rchild);
}
return 1;
}//先序递归遍历
int PostorderBiTree(BiTreeNode *Bt)
{
BiTreeNode *p=Bt;
if(p!=NULL)
{
PostorderBiTree(p->lchild);
PostorderBiTree(p->rchild);
printf("%c",p->data);
}
printf("/n");
return 1;
}//后序递归遍历
//按中序遍历二叉树 非递归算法
void FeiBiTree(BiTreeNode *Bt)
{
int top=0;
BiTreeNode *s[MAXSIZE];
BiTreeNode *p=Bt;
while(top>-1)
{
if(p!=NULL)
{
s[top]=p;
top++;
p=p->lchild;
}
else
{
top--;
if(top>-1)
{
p=s[top];
printf("%3c",p->data);
p=p->rchild;
}
}
}
printf("/n");
}
void CengBiTree(BiTreeNode *Bt)
{
BiTreeNode *p=Bt,*q=NULL;
BiTreeNode *s[MAXSIZE];
int front=0,rear=0;
printf("层序遍历结果:/n");
if(p!=NULL)
{
front=(front+1)%MAXSIZE;
s[front]=p;
}
while(rear!=front)
{
rear=(rear+1)%MAXSIZE;
printf("%2c",s[rear]->data);
p=s[rear];
if(p->lchild)
{
front=(front+1)%MAXSIZE;
s[front]=p->lchild;
}
if(p->rchild)
{
front=(front+1)%MAXSIZE;
s[front]=p->rchild;
}
}
}
//求二叉树的深度
int DepthBiTree(BiTreeNode *Bt)
{
BiTreeNode *p=Bt;
int dep=0,lh=0,rh=0;
if(p!=NULL)
{
lh=DepthBiTree(p->lchild);
rh=DepthBiTree(p->rchild);
dep=(lh>rh)?(++lh):(++rh);
return dep;
}
else return 0;
}
//求二叉树的树叶
int YeshuBiTree(BiTreeNode *Bt)
{
BiTreeNode *p=Bt;
if(p==NULL)
return 0;
else
{
if((p->lchild==NULL)&&(p->rchild==NULL))
ye++;
YeshuBiTree(p->lchild);
YeshuBiTree(p->rchild);
}
return ye;
}
void main()
{
BiTreeNode *BTr=NULL;
char TR[MAXSIZE];
int ye,gao,n;
printf("建立一个二叉树!/n");
printf("请输入二叉树的字符序列串:/n");
scanf("%s",TR);
InitBiTree(&BTr);
BTr=CreatBiTree(&BTr,TR);
do{
printf("请选择:/n");
printf("---------------*********************----------------/n/n");
printf("/t/t中序递归遍历二叉树---1:/n/n");
printf("/t/t中序非递归遍历二叉树---2:/n/n");
printf("/t/t层序遍历二叉树---3:/n/n");
printf("/t/t求树的高度---4:/n/n");
printf("/t/t求树的叶子数---5:/n");
printf("/t/t退出该程序---6/n/n");
printf("---------------*********************---------------/n/n");
scanf("%d",&n);
switch(n)
{
case 1:
InorderBiTree(BTr);
break;
case 2:
FeiBiTree(BTr);
break;
case 3:
CengBiTree(BTr);
break;
case 4:
gao=DepthBiTree(BTr);
printf("/n该二叉树的高为:%d/n",gao);
break;
case 5:
ye=YeshuBiTree(BTr);
printf("该二叉树的叶数为:%d/n",ye);
break;
case 6:
exit(0);
}
}while(n!=6);
}