思想:假设二叉树采用二叉链存储结构,采用层次遍历的方法求出所有节点的层次,并将所有节点和对应的层次放在一个队列中。然后通过扫描队列求出各层的节点总数,最大的层节点总数即为二叉树的宽度。对应的算法如下:
int BTWidth(BTNode *b)
{
struct
{
BTNode *data[MaxSize];//保存队列的节点指针
int level[MaxSize];//保存data中相同下标节点的层次
int front,rear;
} Qu;//非循环队列
BTNode *p;
int k,max,i,n;
Qu.front=Qu.rear=-1;// 置队列为空队
Qu.rear++;
Qu.data[Qu.rear]=b;//根节点指针入队
Qu.level[Qu.rear]=1;//根节点的层次编号为1
while(Qu.front<Qu.rear)//队不空时循环
{
Qu.front++;//出队一次
p=Qu.data[Qu.front];//出队的节点
k=Qu.level[Qu.front];//出队节点的层次
if(p->lchild!=NULL)//左孩子进队
{
Qu.rear++;
Qu.data[Qu.rear]=p->lchild;
Qu.level[Qu.rear]=k+1;
}
if(p->rchild!=NULL)//右孩子进队
{
Qu.rear++;
Qu.data[Qu.rear]=p->rchild;
Qu.level[Qu.rear]=k+1;
}
}
printf(" 各节点的层编号:\n");
for(i=0;i<=Qu.rear;i++)
{
printf("%c,%d\n",Qu.data[i]->data,Qu.level[i]);
}
max=0;i=0;//max中保存同一层最多的节点个数
k=1;//k表示从1层开始查找
while(i<=Qu.rear)//i扫描队中所有元素
{
n=0;//n统计第k层的节点个数
while(i<=Qu.rear&&Qu.level[i]==k)
{
n++;
i++;
}
k=Qu.level[i];
if(n>max)
{
max=n;//求最大的n,并存放在max中
}
}
return max;
}
对于如图所示的二叉树,求宽度的结果如图所示。