二叉树的层次遍历算法,c语言。自己写的不知道为啥运行没有显示。

2024-12-28 16:58:03
推荐回答(2个)
回答1:

#include 

#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;

 



回答2:

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一次,赋值两次。还有你的代码写得不是很简练,希望多看看其它标准的代码多多学习。