1.王道课后版(略有改动)
typedef struct
{
BiTree data[Maxsize];
int level[Maxsize];//这个数组也可以单独定义
int front,rear;
}Q;
int BTWidth(BiTree T)
{
BiTNode *p;
int k,max,i,n;
Q.front=Q.rear=-1;
Q.rear++;
Q.data[Q.rear]=T;
Q.level[Q.rear]=1;
while(Q.front<Q.rear)
{
Q.front++;
p=Q.data[Q.front];
k=Q.level[Q.front];
if(p->lchild)
{
Q.rear++;
Q.data[Q.rear]=p->lchild;
Q.level[Q.rear]=k+1;
}
if(p->rchild)
{
Q.rear++;
Q.data[Q.rear]=p->rchild;
Q.level[Q.rear]=k+1;
}
}
max=0;
i=0;
k=1;
while(i<=Q.rear)
{
n=0;
while(i<Q.rear&&Q.level[i]==k)
{
n++;
i++;
}
k=Q.level[i];
if(n>max)
max=n;
}
return max;
}
2.精简版(个人认为考试写这个就行,再加上必要说明)
查找队尾指针往level放的时候rear-1减不减都行,不影响总量-1是为了对应上队列的位置,所以第一种里边初始都指向-1,第二种指向0,但后边的就得修改,之所以指向0是因为一般都是这么写,这样调用封装好的函数不会有歧义
typedef struct
{
BiTree data[Maxsize];
int front,rear;
}SqQueue;
int BTWidth(BiTree T)
{
BiTNode *p;
int k,max,i,n;
int level[Maxsize];
SqQueue Q;
InitQueue(Q);
EnQueue(Q,T);
level[Q.rear-1]=1;
while(!IsEmpty(Q))
{
DeQueue(Q,p);
k=level[Q.front-1];
if(p->lchild)
{
EnQueue(p->lchild);
level[Q.rear-1]=k+1;
}
if(p->rchild)
{
EnQueue(p->lchild);
level[Q.rear-1]=k+1;
}
}
max=0;
i=0;
k=1;
while(i<=Q.rear-1)
{
n=0;
while(i<Q.rear-1&&level[i]==k)
{
n++;
i++;
}
k=level[i];
if(n>max)
max=n;
}
return max;
}