0.树结构
typedef struct BTNode
{
int data;
struct BTNode *lchild;
struct BTNode *rchild;
}BTNode;
1.层次遍历
void level(BTNode *p)
{
if(!p)//空树直接返回
return;
BTNode *q;//遍历树的指针
BTNode *que[maxSize];//辅助循环队列
int front,rear;
front=rear=0;
rear=(rear+1)%maxSize;
que[rear]=p;//根节点入队,初始化完成
while(front!=rear)
{
front=(front+1)%maxSize;
q=que[front];//出队
visit(q);//访问
if(q->lchild)
{
rear=(rear+1)%maxSize;
que[rear]=q->lchild;
}
if(q->rchild)
{
rear=(rear+1)%maxSize;
que[rear]=q->rchild;
}
}
}
总体思路:根结点入队,出队访问并将左右孩子入队。左孩子出队访问并将其左右孩子入队,右孩子出队访问并将其左右孩子入队… …重复直至队空(上述左右孩子假设均存在)
2.应用——根据层次遍历来求二叉树的宽度
typedef struct St //这是一个顺序队,用来存储结点指针以及所在的层次号
{
BTNode *p; //结点指针
int lno; //结点所在层次号
}St;
int getWidth(BTNode *b)
{
St que[maxSize];
int front,rear;
int Lno,i,j,n,max;
front=rear=0;
BTNode *q;
if(b)
{
++rear;
que[rear].p=b;
que[rear].lno=1;
while(front!=rear)
{
++front;
q=que[front].p;
Lno=que[front].lno;
if(q->lchild)
{
rear++;
que[rear].p=q->lchild;
que[rear].lno=Lno+1;
}
if(q->rchild)
{
rear++;
que[rear].p=q->rchild;
que[rear].lno=Lno+1;
}
}
max=0;
for(i=1;i<=Lno;i++)//遍历Lno个层
{
n=0;
for(j=1;j<=rear;j++)//遍历que数组所有元素
{
if(que[j].lno==i)//数组元素属于第i层,则计数n++
n++;
if(max<n)
max=n;
}
}
return max;
}
else
return 0;
}
小结
广度优先遍历不像三种深度优先遍历,并不是递归的算法;
求二叉树的宽度:求出每层的结点数,然后比较出最大的即宽度。