//使用层次遍历二叉树的最大宽度
typedef struct
{
Btnode * p; //结点指针
int lno; //节点所在层号
}St
int maxNode(BTnode *b)
{
//创建一个顺序非循环队列
St que[maxsize];
int front,rear;
fronf = rear = 0;
int Lno,i,j,n,max; //Lno 用来存储最大层号,max用来存储最大宽度
//使用i,j来遍历数组,得到max
//创建一个工作指针
BTnode *q;
if(b!=NULL)
{
//根节点入队
++rear;
que[rear].p=b;
que[rear].lno=1;//树根所在层次为1
while (front!=rear)
{
//队头出队
++front;
q = que[front].p;
Lno = que[front].lno; //关键语句,保存当前层层号
if (q->lchild!=NULL)//左子树不空则左子树进队
{
++rear;
que[rear].p=q->lchild;
que[rear].lno=Lno+1; //关键语句,子树的层次=根的层次+1
}
if (q->rchild!=NULL)//右子树不空则右子树进队
{
++rear;
que[rear].p=q->rchild;
que[rear].lno=Lno+1; //关键语句,孩子节点层次=根的层次+1
}
//循环结束后,Lno 就保存了此树的最大层次,然后使用一个求和就可以求出最大宽度
}
max = 0;
//使用两个for循环达到找出最大宽度的目的
for (i=1;i<=Lno;++i)
{
n=0
for(j=1;j<=rear;++j)//因为是从下标1处存节点数据的,所以j从1开始遍历
{
if(que[j]==i)
++n;
if (max<n)
max=n;
}
}
return max;
}
return 0;//树为空,则返回0
}