想了好久,查了不少资料,我这个“采集”终于也是弄出来了,希望对需要的人有帮助,有什么不对的地方请私信我!谢谢!
#include<stdio.h>
#include<stdlib.h>
typedef char elemtype;//树中元素的类型
struct BitNode{
elemtype data;
BitNode *lchild,*rchild;
};
typedef BitNode* lqelement;//队列中元素的类型
struct ListQue{
lqelement data;
ListQue* next;
};//节点
struct LQLink{
ListQue* front;
ListQue* rear;
};//指向节点头和尾
int CreateBiTree(BitNode** T);//创建二叉树
int tree_width(BitNode* T);//树的最大宽度
int count_quenum(LQLink Q);//队列中元素个数
LQLink init_ListQue();//创建队列
bool isempty(LQLink Q);//判断队是否为空
LQLink enque(LQLink Q,lqelement x);//进队
LQLink outque(LQLink Q,lqelement &x);//出队
int CreateBiTree(BitNode** T)//创建树 传入指针的地址,以便对形参的修改作用于实参
{
char ch;
scanf("%c",&ch);
getchar();
if(ch=='#'){
*T=NULL;
return 0;
}else{
*T=(BitNode*)malloc(sizeof(BitNode));
if(T==NULL){
printf("failed!");
return 0;
}else{
(*T)->data=ch;
printf("请输入%c的左子树:",ch);
CreateBiTree(&((*T)->lchild));
printf("请输入%c的右子树:",ch);
CreateBiTree(&((*T)->rchild));
}
}
}
int tree_width(BitNode* T)//树的宽度
{
LQLink Q;
Q=init_ListQue();
int count,max=0;
BitNode* temp;
if(T==NULL){
return max;
}//空树时返回0
Q=enque(Q,T);
while(!isempty(Q)){//计算最多的层数
count=count_quenum(Q);
if(count>max){
max=count;
}
for(int i=0;i<count;i++){//每一层的节点入队
Q=outque(Q,temp);
if(temp->lchild!=NULL)
Q=enque(Q,temp->lchild);
if(temp->rchild!=NULL)
Q=enque(Q,temp->rchild);
}
}
return max;
}
int count_quenum(LQLink Q)//计算队列中的元素的个数
{
int num=0;
ListQue* temp=Q.front;
while(temp!=Q.rear){
temp=temp->next;
num++;
}
return num;
}
LQLink init_ListQue()
{
ListQue* lql;
LQLink Q;
lql=(ListQue*)malloc(sizeof(ListQue));
if(lql){
Q.rear=Q.front=lql;
Q.rear->next=NULL;
return Q;
}else{
printf("申请队列节点创建失败!");
exit(1);
}
}
bool isempty(LQLink Q)
{
return Q.front==Q.rear?true:false;
}
LQLink enque(LQLink Q,lqelement x)//进队 返回该队列
{
ListQue* p;
Q.rear->data=x;
p=(ListQue*)malloc(sizeof(ListQue));
if(p){
Q.rear->next=p;
Q.rear=p;
p->next=NULL;
}else{
printf("创建失败!");
exit(1);
}
return Q;
}
LQLink outque(LQLink Q,lqelement &x)//出队 通过形参返回删除的元素 返回该队列
{
ListQue* q;
if(!isempty(Q)){
q=Q.front;
x=q->data;
Q.front=Q.front->next;
free(q);
}else{
printf("队列为空!");
exit(1);
}
return Q;
}
int main()
{
BitNode* T;
int wid;
printf("输入根树(字母):");
CreateBiTree(&T);
wid=tree_width(T);
printf("%d",wid);
return 0;
}