#include
#include
typedef struct bitreenode
{
int data;
struct bitreenode* lchild,*rchild;
}bitreenode,*bitree;
typedef struct node{
bitree data1;
struct node *next;
}node,*nodeptr;
typedef struct queue{
nodeptr front;
nodeptr rear;
}queue ,*queueptr;
void enqueue(queueptr q,bitree x){
nodeptr p=(nodeptr)malloc(sizeof(node));
p->data1=x;
p->next=NULL;
if((q->front==q->rear)&&(q->rear==NULL)) //语法疏漏
q->front=q->rear=p;
else{
q->rear->next=p;
q->rear=p;
}
}
bitree dequeue(queueptr q){
bitree x;
nodeptr p;
if((q->front==q->rear)&&(q->rear==NULL)) //语法疏漏
return 0;
p=q->front;
x=q->front->data1;
q->front=p->next;
if(q->rear==p)
q->front=q->rear=NULL;
free(p);
return x;
}
int buildtree(bitree tree){
int a=1;
queueptr q=(queueptr)malloc(sizeof(queue));
q->front=q->rear=NULL;
bitree tmp,tmp1,tmp2;
tree->data=a++;
enqueue(q,tree);
while(a<16){ //修改了这个while循环
tmp = dequeue(q);
tmp1=(bitree)malloc(sizeof(bitreenode));
tmp1->data=a++;
tmp1->lchild=NULL;
tmp1->rchild=NULL;
tmp->lchild = tmp1;
enqueue(q,tmp1);
tmp2=(bitree)malloc(sizeof(bitreenode));
tmp2->data=a++;
tmp2->lchild=NULL;
tmp2->rchild=NULL;
tmp->rchild = tmp2;
enqueue(q,tmp2);
}
return 0;
}
void levelorder(bitree tree){
queueptr q=(queueptr)malloc(sizeof(queue));
q->front=q->rear=NULL;
bitree tmp;
enqueue(q,tree);
while(q->front!=NULL){
tmp=dequeue(q);
printf("%d\n",tmp->data);
if(tmp->lchild!=NULL)
enqueue(q,tmp->lchild);
if(tmp->rchild!=NULL)
enqueue(q,tmp->rchild);
}
}
int main(){
bitree tree=(bitree)malloc(sizeof(bitreenode));
buildtree(tree);
levelorder(tree);
return 0;
}
buildtree的while代码如下修改:
while(a<=16){
bitree p = dequeue(q);
if (!p)
{
break;
}
tmp=(bitree)malloc(sizeof(bitreenode));
tmp->data=a++;
tmp->lchild=NULL;
tmp->rchild=NULL;
p->lchild=tmp;
tmp2=(bitree)malloc(sizeof(bitreenode));
tmp2->data=a++;
tmp2->lchild=NULL;
tmp2->rchild=NULL;
p->rchild=tmp2;
enqueue(q,tmp);
enqueue(q,tmp2);
}
你的是deque了两次,那是不对的,因为你需要得到一个节点,然后给这个节点的左右孩子赋值,所以你需要deque一次,赋值两次。还有你的代码写得不是很简练,希望多看看其它标准的代码多多学习。