- 求二叉树中结点最多的那层的结点数
代码如下
#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;
}