求二叉树的最大宽度

  • 求二叉树中结点最多的那层的结点数

代码如下

#include <iostream>
#include <stdlib.h> 

#define maxSize 100
typedef struct BTNode{//二叉树结点 
    char data;
    struct BTNode* lchild;
    struct BTNode* rchild;
}BTNode;

typedef struct{//结点及所在层 
    BTNode *p;
    int lno;
}St;

void createBTreePre(BTNode *&p){//创建二叉树 
    char ch;
    scanf("%c",&ch);
    if(ch=='#'){
        p=NULL;
    }else{
        p=(BTNode *)malloc(sizeof(BTNode));
        p->data=ch;
        createBTreePre(p->lchild);
        createBTreePre(p->rchild);
    }
}


int maxNode(BTNode *p){//求二叉树的最大宽度 
    St que[maxSize]; //队列 
    int front,rear,lno,i,j,max,n;
    max=0;
    front=rear=0;
    BTNode *q;

    if(p!=NULL){
        rear++;
        que[rear].p=p;//根节点入队 
        que[rear].lno=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;
            }
            if(q->rchild!=NULL){
                ++rear;
                que[rear].p=q->rchild;
                que[rear].lno=lno+1;
            }
        }
        for(i=1;i<=lno;i++){//层数循环 
            n=0;
            for(j=1;j<=rear;j++){//队列循环 
                if(que[j].lno==i){//结点之间只要层数相同,n加1 
                    n++;//计数的功能 
                }
            }
            max=(max>=n) ? max : n;
        }
        return max;
    }else{
        return 0;
    }
} 
int main(int argc, char** argv) {
    BTNode *p;
    int n;
    createBTreePre(p);
    n=maxNode(p);
    printf("%d\n",n);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_37597859/article/details/79858057
今日推荐