求二叉树的宽度有两种方法:
-
用一个指针记录下每层的最右边的结点,当工作指针的值与该指针一致时,说明一层遍历完毕,这样只需记录下每层的结点数,取最大值即可;
-
记录下每个结点所处于的层数,之后只需对层树相同的结点个数进行计数,取其最大值即可
第一种:
int width1(BiTree bt)
{
//用第一种方法编写如下算法
if(bt == NULL)
return 0;
else
{
Queue qu; qu.front = qu.rear = -1;
BiTree p; //工作指针
BiTree lastnode = bt; //用于指向每层最后一个结点
BiTree newnode = NULL; //用于查找下一层的最后一个结点
int max = 1; int count = 0; //用于记录每层的结点个数
qu.data[++qu.rear] = bt;
while(qu.front != qu.rear)
{
p = qu.data[++qu.front];
if(p->lchild != NULL)
{
qu.data[++qu.rear] = p->lchild;
newnode = p->lchild;
count++;
}
if(p->rchild != NULL)
{
qu.data[++qu.rear] = p->rchild;
newnode = p->rchild;
count++;
}
if(p == lastnode)
{
lastnode = newnode;
if(count>max)
max = count;
count = 0; //不管count有没有大于max,扫描完一层后都要归零
}
}
return max;
}
}
第二种:
int width2(BiTree bt, int* depth)