问题描述
假设二叉树采用二叉链表存储结构,设计一个算法,求非空二叉树 b 的宽度(即具有结
点数最多的那一层的结点个数)。
问题思路
借助树的层次遍历的非递归算法,在处理每层第一个结点和最后一个结点时设置变量记录其在队列中的下标,相减即可得到该层结点数,每层的结点数量都记录在一个数组width中。最后遍历该数组找最大值,即为树的宽度。
代码
int LevelOrder_width(BiTree T){
if(T==NULL){
return 0;
}
BiTNode Q[MaxSize];
int front=-1,rear=-1;
int level=0,last=0,flag=1;//flag记录上一次处理的结点是否为上一层的最右结点,若1则是,当前处理节点为该层第一个结点,并将flag置为0
int i=0,j=0;//记录当前层的第一个结点的rear值和最后一个结点的rear值,相减则为当前层的结点数
int width[MaxSize]=0;//记录每一层宽度的数组
// width[1]=1;
BiTree p;
Q[++rear]=T;
while(front<rear){
p=Q[++front];
if(flag==1){
i=front;
flag=0;
}
if(p->lchild) Q[++rear]=p->lchild;
if(p->rchild) Q[++rear]=p->rchild;
if(front==last)
level++;
flag=1;
j=front;
width[level]=j-i+1;
last=rear;
}
int max=0;//借助max遍历查找数组中最大值即为一层结点数最多的值
for(int k=1;k<=level;k++){
width[k]>max?max=width[k]:continue;
}
return max;
}