#include<stdio.h>
#include<malloc.h>
#include<math.h>
#include<stdlib.h>
#define ERROR 0
#define MaxSize 100
typedef char ElemType;
typedef struct node
{
ElemType data; /*结点的数据元素*/
struct node *lchild; /*指向左孩子*/
struct node *rchild; /*指向右孩子*/
}BTNode; /*定义二叉树存储结构*/
/*创建二叉树*/
BTNode *createBTNode(char *str)
{
BTNode *St[MaxSize],*p=NULL,*b;
int top=-1,k,j=0;
char ch;ch=str[j];
b=NULL;
for(j=0;str[j]!='\0';j++)
{
ch=str[j];
switch(ch)
{
case '(':top++;
St[top]=p;
k=1;
break;
case ')':top--;
break;
case',':k=2;
break;
default:p=(BTNode *)malloc(sizeof(BTNode));
p->data=ch;
p->lchild=p->rchild=NULL;
if(b==NULL)
b=p;
else
{
switch(k)
{
case 1:St[top]->lchild=p;
break;
case 2:St[top]->rchild=p;
break;
}
}
}
}
return b;
}
/*用分层输出二叉树*/
void DispBTNode(BTNode *b)
{
BTNode *qu[MaxSize];
BTNode *p;
int front,rear,n;
n=0;
front=rear=0;
qu[rear++]=NULL;
p=b;
if(p!=NULL)
qu[rear++]=p;
do{
p=qu[front++];
if(p==NULL)
{
qu[rear++]=NULL;
n++;
printf("\n");
}
else
{
printf("(%d,%2c)",n,p->data);
if(p->lchild!=NULL)
qu[rear++]=p->lchild;
if(p->rchild!=NULL)
qu[rear++]=p->rchild;
}
}while(front!=rear-1);
}
/*用分层非递归遍历二叉树*/
void TravLevel(BTNode *b)
{
BTNode *Qu[MaxSize]; /*定义循环队列*/
int front,rear; /*定义队首队尾指针*/
front=rear=0;
if(b!=NULL) /*访问根结点并指针入队*/
printf("%c",b->data);
rear++;
Qu[rear]=b;
while(rear!=front) /*队列不为空*/
{
front=(front+1)%MaxSize;
b=Qu[front]; /*队列指针出队列*/
if(b->lchild!=NULL) /*输出左孩子,并入队列*/
{
printf("%c",b->lchild->data);
rear=(rear+1)%MaxSize;
Qu[rear]=b->lchild;
}
if(b->rchild!=NULL) /*输出右孩子,并入队列*/
{
printf("%c",b->rchild->data);
rear=(rear+1)%MaxSize;
Qu[rear]=b->rchild;
}
}
printf("\n");
}
/*求二叉树的叶子结点个数*/
int LeafNodes(BTNode *b)
{
int num1,num2;
if(b==NULL)
return 0; /*空二叉树,返回结点树0*/
else
if(b->lchild==NULL&&b->rchild==NULL)
return 1; /*只有一个叶节点*/
else
{
num1=LeafNodes(b->lchild); /*递归求左子树上的叶子结点树*/
num2=LeafNodes(b->rchild); /*递归求右子树上的叶子结点树*/
return (num1+num2); /*求叶子结点总数*/
}
}
/*求二叉树的宽度*/
int BTWidth(BTNode *b)
{
struct
{
int lno;
BTNode *p;
}Qu[MaxSize];
int front,rear;
int num,max,i,n;
front=rear=0;
if(b!=NULL)
{
rear++;
Qu[rear].p=b;
Qu[rear].lno=1;
while(rear!=front)
{
front++;
b=Qu[front].p;
num=Qu[front].lno;
if(b->lchild!=NULL)
{
rear++;
Qu[rear].p=b->lchild;
Qu[rear].lno=num+1;
}
if(b->rchild!=NULL)
{
rear++;
Qu[rear].p=b->rchild;
Qu[rear].lno=num+1;
}
}
max=0;
num=1;
i=1;
while(i<=rear)
{
n=0;
while(i<=rear&&Qu[i].lno==num)
{
n++;
i++;
}
num=Qu[i].lno;
if(n>max)
max=n;
}
return max;
}
else
return 0;
}
void main()
{
BTNode *b;
b=createBTNode("A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");
printf("output the btree:");
DispBTNode(b);
printf("\n");
getch();
printf("TravLevel:");
TravLevel(b);
getch();
printf("LeafNodes: %d\n",LeafNodes(b));
printf("BTWidth: %d\n",BTWidth(b));
getch();
}
实验七 二叉树的其他典型算法
最新推荐文章于 2021-12-23 22:14:13 发布