层次遍历应用

//使用层次遍历二叉树的最大宽度
typedef struct 
{
    Btnode * p;        //结点指针
    int     lno;    //节点所在层号
}St

int maxNode(BTnode *b)
{
    //创建一个顺序非循环队列
    St que[maxsize];
    int front,rear;
    fronf = rear = 0;
    int Lno,i,j,n,max;    //Lno 用来存储最大层号,max用来存储最大宽度
                        //使用i,j来遍历数组,得到max
    //创建一个工作指针
    BTnode *q;
    
    if(b!=NULL)
    {
        //根节点入队
        ++rear;
        que[rear].p=b;
        que[rear].lno=1;//树根所在层次为1
        
        while (front!=rear)
        {
            //队头出队
            ++front;
            q = que[front].p;
            Lno = que[front].lno;    //关键语句,保存当前层层号
            
            if (q->lchild!=NULL)//左子树不空则左子树进队
            {
                ++rear;
                que[rear].p=q->lchild;
                que[rear].lno=Lno+1;    //关键语句,子树的层次=根的层次+1
            }
            if (q->rchild!=NULL)//右子树不空则右子树进队
            {
                ++rear;
                que[rear].p=q->rchild;
                que[rear].lno=Lno+1;    //关键语句,孩子节点层次=根的层次+1
            }
            //循环结束后,Lno 就保存了此树的最大层次,然后使用一个求和就可以求出最大宽度
        }
        max = 0;
        //使用两个for循环达到找出最大宽度的目的
        for (i=1;i<=Lno;++i)
        {
            n=0
            for(j=1;j<=rear;++j)//因为是从下标1处存节点数据的,所以j从1开始遍历
            {
                if(que[j]==i)
                ++n;
            
                if (max<n)
                    max=n;
            }
        }
        return max;
    }
    return 0;//树为空,则返回0
}
posted @ 2019-12-13 13:06  周青春-ZD  阅读(356)  评论(0编辑  收藏  举报