总思路就是以层序遍历为模板,往里面套东西。本题的关键在于如果判断哪些结点属于同一层
我采用precnt和curcnt来记录每层的结点个数,level表示当前处理的层数(根结点算0层)。具体代码如下。
typedef struct LsBiNode {
ElemType data;
int ltag, rtag;
struct LsBiNode* lchild, *rchild;
}LsBiNode,*BiTree;
void Btwidth(BiTree bt) {
int level = 1,precnt=0,curcnt=0; //precnt表示父节点个数,curcnt表示这些父节点的子节点个数
int a[10] = { 0 }; //假设就10层深度
LsBiNode* p = bt;
Queue q;
initqueue(q); //初始化队列
Enqueue(q, p);
precnt = 1;
a[0] = 1; //第一层为根结点,有一个结点。从数组下标10开始存
while (!isempty(q)) { //层次遍历的代码
Dequeue(q, p);
if (p->lchild != NULL&&precnt!=0) {
a[level]++; curcnt++; Enqueue(q, p->lchild);
}
if (p->rchild != NULL && precnt != 0) {
a[level]++; curcnt++; Enqueue(q, p->rchild);
}
precnt--; //每处理完一个父节点就precnt-1
if (precnt == 0) { //当precnt=0时表明该层已经处理结束
precnt = curcnt; curcnt = 0; level++; //下层的结点总数即curcnt的个数
}
}
int max = a[0];
for (int i = 1; a[i]!=0; i++) {
if (max < a[i]) {
max = a[i];
}
}
printf("最大树宽是 %d", max);
}