兰秋葭月 2021-10-18 20:57 采纳率: 85.7%
浏览 603
已结题

编写按层次顺序遍历二叉树的算法 ;实验要求:以二叉链表作为存储结构

我基本是按王道数据结构书里的代码敲的,但是运行不了,还有两个警告,请求指点

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef char ElemType;
//二叉树 
typedef struct BSTNode{
    ElemType data;
    struct BSTNode *lchild,*rchild;
}BSTNode,*BSTree;
//队列节点 
typedef struct{
    ElemType data;
    struct LinkNode *next;
}LinkNode;
//queue
typedef struct{
    LinkNode *front,*rear;
}LinkQueue;
//初始化队列 
void InitQueue(LinkQueue Q){
    Q.front=Q.rear=(LinkNode *)malloc(sizeof(LinkNode));
    Q.front->next=NULL;
}
//判空 
bool IsEmpty(LinkQueue Q){
    printf("\nisempty");
    if(Q.front==Q.rear)    return true;
    else
        return false;
}
//入队 
void EnQueue(LinkQueue Q,BSTree T){
    LinkNode *s=(LinkNode*)malloc(sizeof(LinkNode));
    s->data=T->data;
    s->next=NULL;
    Q.rear->next=s;
    Q.rear=s;
}
//出队 
bool DeQueue(LinkQueue Q,BSTree p){
    if(Q.front==Q.rear)    return false;
    LinkNode *t=Q.front->next;
    p->data=t->data;
    Q.front->next=t->next;
    if(Q.rear==t)
        Q.rear=Q.front;
    free(t);
    return true;
}
//按先序遍历的顺序创建二叉树 
BSTree Create(){
    BSTree T=NULL;
    ElemType ch;
    scanf("%c",&ch);
    if(ch=='#')    T=NULL;
    else{
        T=(BSTree)malloc(sizeof(BSTNode));
        T->data=ch;
        T->lchild=Create();
        T->rchild=Create();
    }
    return T;
}
//层次遍历 
void LevelOrder(BSTree T,LinkQueue Q){
    InitQueue(Q);
    BSTree p;
    EnQueue(Q,T);//根节点入队 
    while(!IsEmpty(Q)){
        DeQueue(Q,p);//队头节点出队 
        printf("%c",p->data);//访问出队节点 
        if(p->lchild!=NULL)
            EnQueue(Q,p->lchild);
        if(p->rchild!=NULL)
            EnQueue(Q,p->rchild);
    }
}
int main(){
    BSTree T;
    LinkQueue Q;
    T=Create();
    LevelOrder(T,Q);
    return 0;
}

img

  • 写回答

1条回答 默认 最新

  • qzjhjxj 2021-10-19 00:31
    关注

    修改如下,供参考:

    #include<stdio.h>
    #include<stdlib.h>
    //#include<stdbool.h>
    //二叉树
    typedef struct BSTNode{
        char data;  //ElemType data;
        struct BSTNode *lchild,*rchild;
    }BSTNode,*BSTree;
    
    typedef BSTree ElemType;//修改
    
    //队列节点
    typedef struct LinkNode{//修改
        ElemType data;      //修改
        struct LinkNode *next;
    }LinkNode;
    //queue
    typedef struct{
        LinkNode *front,*rear;
    }LinkQueue;
    //初始化队列 
    void InitQueue(LinkQueue & Q){
        Q.front=Q.rear=(LinkNode *)malloc(sizeof(LinkNode));
        Q.front->next=NULL;
    }
    //判空 
    bool IsEmpty(LinkQueue Q){
                              //printf("\nisempty");
        if(Q.front==Q.rear)
            return true;
        else
            return false;
    }
    //入队
    void EnQueue(LinkQueue & Q,BSTree T){ //修改 &Q  引用
        LinkNode *s=(LinkNode*)malloc(sizeof(LinkNode));
        s->data = T;  //s->data=T->data;
        s->next=NULL;
        Q.rear->next=s;
        Q.rear=s;
    }
    //出队 
    bool DeQueue(LinkQueue & Q,BSTree & p){//修改 &Q 引用
        if(Q.front==Q.rear)return false;
        LinkNode *t=Q.front->next;
        p = t->data;
        Q.front->next=t->next;
        if(Q.rear==t)
           Q.rear=Q.front;
        free(t);
        return true;
    }
    //按先序遍历的顺序创建二叉树 
    BSTree Create()
    {
        BSTree T=NULL;
        char ch;       //ElemType ch;
        scanf("%c",&ch);
        getchar();
        if(ch=='#')    T=NULL;
        else{
            T=(BSTree)malloc(sizeof(BSTNode));
            T->data=ch;
            T->lchild=Create();
            T->rchild=Create();
        }
        return T;
    }
    //层次遍历 
    void LevelOrder(BSTree T,LinkQueue Q){
        InitQueue(Q);
        BSTree p;
        EnQueue(Q,T);//根节点入队 
        while(!IsEmpty(Q)){
            DeQueue(Q,p);//队头节点出队
            printf("%c ",p->data);//访问出队节点
            if(p->lchild!=NULL)
                EnQueue(Q,p->lchild);
            if(p->rchild!=NULL)
                EnQueue(Q,p->rchild);
        }
    }
    int main()
    {
        BSTree T;
        LinkQueue Q;
        T=Create();
        LevelOrder(T,Q);
    
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 10月27日
  • 已采纳回答 10月19日
  • 创建了问题 10月18日

悬赏问题

  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的