二叉树层序遍历,不知道错在哪了


if(p->lchrid!=NULL){
            EnQueue(Q,p->lchrid);
        } 

img

img


#include<stdio.h>
#include<stdlib.h>
//树 
typedef char BiElemType; 
typedef struct BiLNode{
    BiElemType x;
    struct BiLNode *lchrid;
    struct BiLNode *rchrid;
}BiLNode,*BiTree;
//辅助队列
typedef struct tag{
    BiTree p;
    struct tag *pnext;
}tag_t,*ptag_t;

//队列
typedef int ElemType; 
typedef struct LinkNode{
    ElemType data;
    struct LinkNode *next;
}LinkNode;
 typedef struct LinkQueue{
     LinkNode *front;
    LinkNode *rear;  
 }LinkQueue;
//初始化队列
void Init_Queue(LinkQueue &Q){
    Q.front = Q.rear = (LinkNode*)malloc(sizeof(LinkNode));
    Q.front->next = NULL;
}
//判断是否为空
bool empty_Queue(LinkQueue Q){
    if(Q.front==Q.rear){
        return true;
    }else{
        return false;
    }
}
//入队
bool EnQueue(LinkQueue &Q,ElemType x){
    LinkNode *pnew;
    pnew = (LinkNode*)malloc(sizeof(LinkNode));
    pnew->data = x;
    pnew->next = NULL;
    Q.rear->next = pnew;
    Q.rear = pnew;
    return true;
}
//出队
bool DeQueue(LinkQueue &Q,ElemType &x){
    if(empty_Queue(Q)){
        return false;
    }
    LinkNode *q;
    q = Q.front->next;
    x = q->data;
    Q.front->next = q->next;
    if(Q.rear == q){
        Q.front = Q.rear;
    }
    free(q);
    return true;
} 

//前序遍历
void Preorder(BiTree tree){
    if(tree!=NULL){
        printf("%c",tree->x);//当前结点 
        Preorder(tree->lchrid);//左孩子
        Preorder(tree->rchrid);//右孩子 
    }
} 
//中序遍历
void Inorder(BiTree tree){
    if(tree!=NULL){
        Inorder(tree->lchrid);//左孩子
        printf("%c",tree->x);//当前结点 
        Inorder(tree->rchrid);//右孩子 
    }
} 
//后序遍历
void Postorder(BiTree tree){
    if(tree!=NULL){
        Postorder(tree->lchrid);//左孩子
        Postorder(tree->rchrid);//右孩子
        printf("%c",tree->x);//当前结点  
    }
} 

//层序遍历,又叫广度优先遍历(前序遍历,又叫深度优先遍历)
void leveorder(BiTree T){
    //1.创建队列
    LinkQueue Q;
    //初始化队列
    Init_Queue(Q);
    BiTree p;//储存出队结点
    EnQueue(Q,T);
    while(!empty_Queue){
        DeQueue(Q,p);
        putchar(p->x);//等价于printf("%c",c);
        if(p->lchrid!=NULL){
            EnQueue(Q,p->lchrid);
        }
        if(p->rchrid!=NULL){
            EnQueue(Q,p->rchrid);
        }  
    } 
} 
int main(){
        //1.定义树
    BiTree tree=NULL;
    BiTree pnew;
    char x;
    //定义辅助队列
    ptag_t phead=NULL;
    ptag_t ptail=NULL;
    ptag_t listpnew=NULL;
    ptag_t pcur=NULL;
    while(scanf("%c",&x)){
        //1.输入中断条件
        if(x=='\n'){
            break;
        }
        pnew = (BiTree)calloc(1,sizeof(BiLNode));
        pnew->x = x;
        listpnew = (ptag_t)calloc(1,sizeof(tag_t));
        listpnew->p = pnew;
        //判断头结点是否为空
        if(tree==NULL) {
            tree = pnew;
            phead = listpnew;
            ptail = listpnew;
            pcur = listpnew;
        }else{
            //若是树根节点已经输入,申请新结点 
            ptail->pnext = listpnew;
            ptail = listpnew;
            //放入元素b
            if(pcur->p->lchrid==NULL){
                pcur->p->lchrid = pnew;
            }else if(pcur->p->rchrid==NULL){
                pcur->p->rchrid = pnew;
            } 
        }
    }
    printf("--------Preorder---------\n");//前序遍历又叫深度优先遍历
    //前序遍历,先打印当前,再左再右 
    Preorder(tree);
    printf("--------Preorder---------\n");
    //中序遍历,先打印左,再当前再右 
    Inorder(tree);
    printf("--------Preorder---------\n");
    //后序遍历,先打印左,再右再当前 
    Postorder(tree);
    printf("--------levelorder---------\n");
    levelorder(tree); 
    return 0; 
} 

这个是完整代码

以下标注了 修改的就是要改的地方:

 
#include<stdio.h>
#include<stdlib.h>
//树 
typedef char BiElemType; 
typedef struct BiLNode{
    BiElemType x;
    struct BiLNode *lchrid;
    struct BiLNode *rchrid;
}BiLNode,*BiTree;
//辅助队列
typedef struct tag{
    BiTree p;
    struct tag *pnext;
}tag_t,*ptag_t;
 
//队列
typedef BiTree ElemType; // 修改
typedef struct LinkNode{
    ElemType data;
    struct LinkNode *next;
}LinkNode;
 typedef struct LinkQueue{
     LinkNode *front;
    LinkNode *rear;  
 }LinkQueue;
//初始化队列
void Init_Queue(LinkQueue &Q){
    Q.front = Q.rear = (LinkNode*)malloc(sizeof(LinkNode));
    Q.front->next = NULL;
}
//判断是否为空
bool empty_Queue(LinkQueue Q){
    if(Q.front==Q.rear){
        return true;
    }else{
        return false;
    }
}
//入队
bool EnQueue(LinkQueue &Q,ElemType x){
    LinkNode *pnew;
    pnew = (LinkNode*)malloc(sizeof(LinkNode));
    pnew->data = x;
    pnew->next = NULL;
    Q.rear->next = pnew;
    Q.rear = pnew;
    return true;
}
//出队
bool DeQueue(LinkQueue &Q,ElemType &x){
    if(empty_Queue(Q)){
        return false;
    }
    LinkNode *q;
    q = Q.front->next;
    x = q->data;
    Q.front->next = q->next;
    if(Q.rear == q){
        Q.front = Q.rear;
    }
    free(q);
    return true;
} 
 
//前序遍历
void Preorder(BiTree tree){
    if(tree!=NULL){
        printf("%c",tree->x);//当前结点 
        Preorder(tree->lchrid);//左孩子
        Preorder(tree->rchrid);//右孩子 
    }
} 
//中序遍历
void Inorder(BiTree tree){
    if(tree!=NULL){
        Inorder(tree->lchrid);//左孩子
        printf("%c",tree->x);//当前结点 
        Inorder(tree->rchrid);//右孩子 
    }
} 
//后序遍历
void Postorder(BiTree tree){
    if(tree!=NULL){
        Postorder(tree->lchrid);//左孩子
        Postorder(tree->rchrid);//右孩子
        printf("%c",tree->x);//当前结点  
    }
} 
 
//层序遍历,又叫广度优先遍历(前序遍历,又叫深度优先遍历)
void levelorder(BiTree T){ // 名称修改
    //1.创建队列
    LinkQueue Q;
    //初始化队列
    Init_Queue(Q);
    BiTree p;//储存出队结点
    EnQueue(Q,T);
    while(!empty_Queue(Q)){ // 修改
        DeQueue(Q,p);
        putchar(p->x);//等价于printf("%c",c);
        if(p->lchrid!=NULL){
            EnQueue(Q,p->lchrid);
        }
        if(p->rchrid!=NULL){
            EnQueue(Q,p->rchrid);
        }  
    } 
} 
int main(){
        //1.定义树
    BiTree tree=NULL;
    BiTree pnew;
    char x;
    //定义辅助队列
    //ptag_t phead=NULL;
    ptag_t ptail=NULL;
    ptag_t listpnew=NULL;
    ptag_t pcur=NULL;
    while(scanf("%c",&x)){
        //1.输入中断条件
        if(x=='\n'){
            break;
        }
        pnew = (BiTree)calloc(1,sizeof(BiLNode));
        pnew->x = x;
        listpnew = (ptag_t)calloc(1,sizeof(tag_t));
        listpnew->p = pnew;
        //判断头结点是否为空
        if(tree==NULL) {
            tree = pnew;
            //phead = listpnew;
            ptail = listpnew;
            pcur = listpnew;
        }else{
            //若是树根节点已经输入,申请新结点 
            ptail->pnext = listpnew;
            ptail = listpnew;
            //放入元素b
            if(pcur->p->lchrid==NULL){
                pcur->p->lchrid = pnew;
            }else if(pcur->p->rchrid==NULL){
                pcur->p->rchrid = pnew;
            } 
        }
    }
    printf("--------Preorder---------\n");//前序遍历又叫深度优先遍历
    //前序遍历,先打印当前,再左再右 
    Preorder(tree);
    printf("\n--------Inorder---------\n"); // 修改
    //中序遍历,先打印左,再当前再右 
    Inorder(tree);
    printf("\n--------Postorder---------\n"); // 修改
    //后序遍历,先打印左,再右再当前 
    Postorder(tree);
    printf("\n--------levelorder---------\n"); // 修改
    levelorder(tree); 
    return 0; 
} 

效果如图 :

img

修改后代码 如下 : 如有有帮助给个采纳谢谢

#include<stdio.h>
#include<stdlib.h>

// 树
typedef char BiElemType;
typedef struct BiLNode {
    BiElemType x;
    struct BiLNode *lchrid;
    struct BiLNode *rchrid;
} BiLNode, *BiTree;

// 辅助队列
typedef struct tag {
    BiTree p;
    struct tag *pNext;
} tag_t, *ptag_t;

// 队列
typedef BiTree ElemType;
typedef struct LinkNode {
    ElemType data;
    struct LinkNode *next;
} LinkNode;

typedef struct LinkQueue {
    LinkNode *front;
    LinkNode *rear;
} LinkQueue;

// 初始化队列
void Init_Queue(LinkQueue &Q) {
    Q.front = Q.rear = (LinkNode*)malloc(sizeof(LinkNode));
    Q.front->next = NULL;
}

// 判断是否为空
bool empty_Queue(LinkQueue Q) {
    if(Q.front == Q.rear) {
        return true;
    } else {
        return false;
    }
}

// 入队
bool EnQueue(LinkQueue &Q, ElemType x) {
    LinkNode *pNew;
    pNew = (LinkNode*)malloc(sizeof(LinkNode));
    pNew->data = x;
    pNew->next = NULL;
    Q.rear->next = pNew;
    Q.rear = pNew;
    return true;
}

// 出队
bool DeQueue(LinkQueue &Q, ElemType &x) {
    if(empty_Queue(Q)) {
        return false;
    }
    LinkNode *q;
    q = Q.front->next;
    x = q->data;
    Q.front->next = q->next;
    if(Q.rear == q) {
        Q.front = Q.rear;
    }
    free(q);
    return true;
}

// 前序遍历
void Preorder(BiTree tree) {
    if(tree != NULL) {
        printf("%c",tree->x); // 当前结点
        Preorder(tree->lchrid); // 左孩子
        Preorder(tree->rchrid); // 右孩子
    }
}

// 中序遍历
void Inorder(BiTree tree) {
    if(tree != NULL) {
        Inorder(tree->lchrid); // 左孩子
        printf("%c",tree->x); // 当前结点
        Inorder(tree->rchrid); // 右孩子
    }
}

// 后序遍历
void Postorder(BiTree tree) {
    if(tree != NULL) {
        Postorder(tree->lchrid); // 左孩子
        Postorder(tree->rchrid); // 右孩子
        printf("%c",tree->x); // 当前结点
    }
}

// 层序遍历,又叫广度优先遍历
void levelorder(BiTree T) {
    // 创建队列
    LinkQueue Q;
    // 初始化队列
    Init_Queue(Q);
    BiTree p; // 储存出队结点
    EnQueue(Q, T);
    while(!empty_Queue(Q)) {
        DeQueue(Q, p);
        putchar(p->x); // 等价于printf("%c",c);
        if(p->lchrid != NULL) {
            EnQueue(Q, p->lchrid);
        }
        if(p->rchrid != NULL) {
            EnQueue(Q, p->rchrid);
        }
    }
}

int main() {
    // 定义树
    BiTree tree = NULL;
    BiTree pNew;
    char x;

    // 定义辅助队列
    ptag_t pHead = NULL;
    ptag_t pTail = NULL;
    ptag_t listPnew = NULL;
    ptag_t pCur = NULL;

    while(scanf("%c", &x)) {
        // 输入中断条件
        if(x == '\n') {
            break;
        }
        pNew = (BiTree)calloc(1, sizeof(BiLNode));
        pNew->x = x;
        listPnew = (ptag_t)calloc(1, sizeof(tag_t));
        listPnew->p = pNew;

        // 判断头结点是否为空
        if(tree == NULL) {
            tree = pNew;
            pHead = listPnew;
            pTail = listPnew;
            pCur = listPnew;
        } else {
            // 若是树根节点已经输入,申请新结点
            pTail->pNext = listPnew;
            pTail = listPnew;

            // 放入元素b
            if(pCur->p->lchrid == NULL) {
                pCur->p->lchrid = pNew;
            } else if(pCur->p->rchrid == NULL) {
                pCur->p->rchrid = pNew;
            }
        }
    }

    printf("--------Preorder---------\n");
    // 前序遍历,先打印当前,再左再右
    Preorder(tree);
    printf("\n");

    printf("--------Inorder---------\n");
    // 中序遍历,先打印左,再当前再右
    Inorder(tree);
    printf("\n");

    printf("--------Postorder---------\n");
    // 后序遍历,先打印左,再右再当前
    Postorder(tree);
    printf("\n");

    printf("--------levelorder---------\n");
    levelorder(tree);

    return 0;
}