1.算法思想
使用层序遍历+队列实现。
首先将根结点入队,之后将队头元素出队,然后判断其左右孩子是否存在,如果存在则入队。当访问到最后一个结点时,已经将下一层的结点都入队。判断当前最大宽度与下一层的宽度,取较大值作为新的宽度。循环上述步骤,直到将该二叉树遍历完成。
2.定义结构体
typedef struct BiNode {
int data;
struct BiNode* lchild;
struct BiNode* rchild;
} BiNode,*BiTree;
3.函数实现
/*层序遍历+队列*/
int getWidth(BiTree T) {
BiNode *p, *Q[MAXSIZE];
int front = -1, rear = -1;//队头和队尾
int width = 0, last = 0;
if(!T) {
printf("该二叉树为空!\n");
return 0;
}
Q[++rear] = T;//根结点入队
width = 1;//根结点入队,设置宽度为1
while(front < rear) {
p = Q[++front];
if(p->lchild) {
Q[++rear] = p->lchild;
}
if(p->rchild) {
Q[++rear] = p->rchild;
}
if(last == front) {
if(rear - front > width) {//下一层宽度大于当前最大宽度
width = rear - front;
}
last = rear;
}
}
return width;
}
4.测试结果
使用如下二叉树进行测试:
得到的结果为:
5.完整代码
#include <stdio.h>
#include <malloc.h>
#define MAXSIZE 20
typedef struct BiNode {
int data;
struct BiNode* lchild;
struct BiNode* rchild;
} BiNode,*BiTree;
/*层序遍历+队列*/
int getWidth(BiTree T) {
BiNode *p, *Q[MAXSIZE];
int front = -1, rear = -1;//队头和队尾
int width = 0, last = 0;
if(!T) {
printf("该二叉树为空!\n");
return 0;
}
Q[++rear] = T;//根结点入队
width = 1;//根结点入队,设置宽度为1
while(front < rear) {
p = Q[++front];
if(p->lchild) {
Q[++rear] = p->lchild;
}
if(p->rchild) {
Q[++rear] = p->rchild;
}
if(last == front) {
if(rear - front > width) {//下一层宽度大于当前最大宽度
width = rear - front;
}
last = rear;
}
}
return width;
}
int main() {
BiTree l1 = (BiTree)malloc(sizeof(BiNode));
BiNode *l2 = (BiNode *)malloc(sizeof(BiNode));
BiNode *l3 = (BiNode *)malloc(sizeof(BiNode));
BiNode *l4 = (BiNode *)malloc(sizeof(BiNode));
BiNode *l5 = (BiNode *)malloc(sizeof(BiNode));
BiNode *l6 = (BiNode *)malloc(sizeof(BiNode));
BiNode *l7 = (BiNode *)malloc(sizeof(BiNode));
l1->data = 1;
l2->data = 2;
l3->data = 3;
l4->data = 4;
l5->data = 5;
l6->data = 6;
l7->data = 7;
l1->lchild = l2;
l1->rchild = l3;
l2->lchild = l4;
l2->rchild = l5;
l3->lchild = l6;
l3->rchild = l7;
l4->lchild = NULL;
l4->rchild = NULL;
l5->lchild = NULL;
l5->rchild = NULL;
l6->lchild = NULL;
l6->rchild = NULL;
l7->lchild = NULL;
l7->rchild = NULL;
int result = getWidth(l1);
printf("该二叉树的宽度为:%d\n", result);
return 0;
}