统计二叉树宽度的算法
算法思想
采用层次遍历将所有结点和对应的层次放入队列中,然后通过遍历队列的方法计算各层的结点总数,最后比较每一层结点总数,最大值即为二叉树宽度。
完整代码
#define MaxSize 100
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
typedef struct TreeNode* BiTree;
typedef struct{
BiTree data[MaxSize]; //保存队列中的结点指针
int level[MaxSize]; //保存data中相同下标结点的层次
int front,rear;
}Queue;
int getMaxWidth(BiTree root){
Queue Qu;
BiTree p;
int k,max,i,n;
//队列为空
Qu.front=Qu.rear=-1;
//根结点指针入队
Qu.data[++Qu.rear]=root;
//根结点层次为1
Qu.level[Qu.rear]=1;
while(Qu.front<Qu.rear){
//①出队
Qu.front++;
//出队结点
p=Qu.data[Qu.front];
//出队结点的层次
k=Qu.level[Qu.front];
//左孩子进队列
if(p->left!=NULL){
Qu.data[++Qu.rear]=p->left;
Qu.level[Qu.rear]=k+1;
}
//右孩子进队列
if(p->right!=NULL){
Qu.data[++Qu.rear]=p->right;
Qu.level[Qu.rear]=k+1;
}
}
//max保存同一层最多的结点个数
max=0;
//i扫描队列中所有元素
i=0;
//k表示从第一层开始查找
k=1;
while(i<=Qu.rear){
//k统计第k层的结点个数
n=0;
while(i<=Qu.rear&&Qu.level[i]==k){
n++;
i++;
}
k=Qu.level[i];
if(n>max){
//保存最大的n
max=n;
}
}
return max;
}
结合例子分析
例如:
分析:
注意
①处代码不能改为
//出队结点
p=Qu.data[++Qu.front];
//出队结点的层次
k=Qu.level[++Qu.front];