求最大宽度可采用层次遍历的方法,定义一个队列,先把树的根结点入队,每次出队一个结点如果有他有孩子结点就把孩子结点入队以此类推。
记下各层结点数,每层遍历完毕,若结点数大于原先最大宽度,则修改最大宽度。
int Width(BiTree T)
{
if (T == NULL) return 0; //树空宽度为0
SeqQueue Q;
int temp = 0, last = 0, max = 0; //暂存temp层的宽度用来和最大值比较,last一层的最后一个结点在队列中的位置
ElemType e = T;
InitQueue(&Q);
InQueue(&Q, &e);
while (Q.front <= last)
{
OutQueue(&Q, &e);
temp++;
if (e->lchild != NULL)
{
InQueue(&Q, &e->lchild);
}
if (e->rchild != NULL)
{
InQueue(&Q, &e->rchild);
}
if (Q.front > last) //一层结点全部遍历完成,开始判断最大宽度
{
last = Q.rear-1;
max = max > temp ? max : temp;
temp = 0;
}
}
return max;
}
完整代码实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 100
//定义二叉树
typedef struct BiTNode
{
char data;
struct BiTNode *lchild, *rchild;
}BiTN