昨天晚上帮同学看代码,发现了一个新的方法,想了又想还是把它写下来。下面就是算法的代码:
#include<stdio.h>
#include<malloc.h>
#define Max_size 1000
struct Tree{//存节点信息
char ch;
Tree *l,*r;
};
Tree *root;
struct Queue{//队列
Tree *data;
}ar[Max_size];
char k[10];
void set(Tree *&t){//开辟空间
t=(Tree
*)malloc(sizeof(Tree));
t->l=NULL;
t->r=NULL;
}
void BuildTwoTree(Tree *p,char ch){//前序建树
p->ch=ch;
printf("%c的左儿子是否为空:",ch);
scanf("%s",k);
if(k[0]!='0'){
set(p->l);
BuildTwoTree(p->l,k[0]);
}
printf("%c的右儿子是否为空:",ch);
scanf("%s",k);
if(k[0]!='0'){
set(p->r);
BuildTwoTree(p->r,k[0]);
}
}
int W(Tree *p){//求二叉树的宽度
int
rear=-1,front=-1,t=-1,flag=0,c=0;
if(p!=NULL){
rear++;
ar[rear].data=p;
flag=1;
t=rear;
}
while(front<t){
front++;
p=ar[front].data;
if(p->l){
c++;
rear++;
ar[rear].data=p->l;
}
if(p->r){
c++;
rear++;
ar[rear].data=p->r;
}
if(front==t){
if(flag<c)
flag=c;
c=0;
t=rear;
}
}
return flag;
}
int main(){
set(root);
printf("根节点是否为空(0默认为空):\n");
scanf("%s",k);
BuildTwoTree(root,k[0]);
printf("此二叉树的宽度为:");
printf("%d\n",W(root));
return 0;
}
若有雷同,纯属巧合!