二叉树:层次遍历

    xiaoxiao2022-07-14  149

    创建一颗二叉树,利用队列输出二叉树的层次遍历序列

    /* ************************ 创建一棵二叉树(二叉链式),利用队列输出二叉树的层次遍历序列。 **************************/

    #include <stdio.h> #include <stdlib.h> typedef struct NNode { char data; struct NNode *LChild; struct NNode *RChild; } BiNode, *BiTree; //定义二叉树结点和结点指针 typedef BiTree QueueElementType; typedef struct Node { QueueElementType data; struct Node *next; } LinkQueueNode; //定义队列结点 typedef struct { LinkQueueNode *front; //队列头结点指针 LinkQueueNode *rear; //队列尾结点指针 } LinkQueue; //定义队列 int InitQueue(LinkQueue *Q) //初始化队列 { Q->front = (LinkQueueNode *)malloc(sizeof(LinkQueueNode)); if (Q->front != NULL) { Q->rear = Q->front; Q->front->next = NULL; return 1; } else return 0; //溢出 } int EnterQueue(LinkQueue *Q, QueueElementType x) //元素x入链队列 尾插法 { LinkQueueNode *newnode; newnode = (LinkQueueNode *)malloc(sizeof(LinkQueueNode)); if (newnode != NULL) { newnode->data = x; newnode->next = NULL; Q->rear->next = newnode; Q->rear = newnode; return 1; } else return 0; } int DeleteQueue(LinkQueue *Q, QueueElementType *x) //链队列出队 从开始的头开始取 { LinkQueueNode *p; if (Q->front == Q->rear) return 0; p = Q->front->next; Q->front->next = p->next; if (Q->rear == p) Q->rear = Q->front; //如果去掉结点p后,队列为空 不要忘记将队列置空 *x = p->data; free(p); return 1; } int IsEmpty(LinkQueue *Q) //队列为空返回1 不为空返回0 { if (Q->front == Q->rear) return 1; else return 0; } void CreateBiTree(BiTree *bt) //用先序遍历创建二叉树 { char ch; ch = getchar(); if (ch == '.') (*bt) = NULL; else { *bt = (BiTree)malloc(sizeof(BiNode)); (*bt)->data = ch; CreateBiTree(&((*bt)->LChild)); CreateBiTree(&((*bt)->RChild)); } } int LayerOrder(BiTree bt) //层次遍历二叉树 成功遍历返回1 失败返回0 { LinkQueue Q; BiTree p; InitQueue(&Q); if (bt == NULL) return 0; EnterQueue(&Q, bt); while (!IsEmpty(&Q)) { if (DeleteQueue(&Q, &p)) ; printf("%c ", p->data); if (p->LChild) EnterQueue(&Q, p->LChild); if (p->RChild) EnterQueue(&Q, p->RChild); } return 1; } int main() { BiTree bt; printf("用先序遍历创建二叉树:"); CreateBiTree(&bt); printf("层次遍历为:"); if (LayerOrder(bt)) printf("\n层次遍历成功\n"); else printf("\n层次遍历失败\n"); return 0; }
    最新回复(0)