用C语言写出以下问题的代码并且要有注释【问题描述】 给定一颗二叉树,要求从下至上按层遍历二叉树,每层的访问顺序是从左到右,每一层单独输出一行。 【输入形式】 广义表表示的二叉树,结点元素类型为整型,且都大于0,例如:1( 2( 3 ( 4, 5 ) ), 6( 7, 8( 9, 10 ) ) ) 【输出形式】 从下至上,打印每一层的结点元素值,元素间以空格隔开。每层的访问顺序是从左到右,每一层单独输出一行。 【样例输入】 1(2(3(4,5)),6(7,8(9,10))),字符串内没有空格 【样例输出】 4 5 9 10 3 7 8 2 6 1 【样例说明】 【评分标准】 本题目主要考察两个知识点: 1.创建二叉树存储结构 2.按层次遍历二叉树的算法
时间: 2024-02-18 16:59:53 浏览: 80
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
// 二叉树结构体
typedef struct BiTNode {
int data;
struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;
// 队列结构体
typedef struct {
BiTree data[MAXSIZE];
int front, rear;
} Queue;
// 初始化队列
void InitQueue(Queue *q) {
q->front = q->rear = 0;
}
// 判断队列是否为空
int IsEmpty(Queue q) {
return q.front == q.rear;
}
// 入队
void Enqueue(Queue *q, BiTree t) {
q->data[q->rear++] = t;
}
// 出队
BiTree Dequeue(Queue *q) {
if (IsEmpty(*q)) {
printf("Queue is empty!\n");
exit(1);
}
BiTree t = q->data[q->front++];
return t;
}
// 创建二叉树
void CreateBiTree(BiTree *T) {
char c;
scanf("%c", &c);
if (c == ',') {
*T = NULL;
} else if (c == ')') {
*T = NULL;
return;
} else {
*T = (BiTree)malloc(sizeof(BiTNode));
(*T)->data = c - '0';
CreateBiTree(&((*T)->lchild));
CreateBiTree(&((*T)->rchild));
}
}
// 按层次遍历二叉树
void LevelOrder(BiTree T) {
Queue q;
BiTree p;
InitQueue(&q);
Enqueue(&q, T);
while (!IsEmpty(q)) {
int level_count = q.rear - q.front; // 记录当前层中结点的个数
while (level_count--) {
p = Dequeue(&q);
printf("%d ", p->data);
if (p->lchild) {
Enqueue(&q, p->lchild);
}
if (p->rchild) {
Enqueue(&q, p->rchild);
}
}
printf("\n");
}
}
int main() {
BiTree T;
printf("请输入一棵二叉树(广义表表示): ");
CreateBiTree(&T);
printf("\n按层次遍历输出结果为:\n");
LevelOrder(T);
return 0;
}
```
注释已经在代码中给出了,具体实现方式也注明了。需要注意的是,广义表表示的二叉树在创建时需要根据括号进行判断,同时每个数字字符需要减去 '0' 转化为整型。
阅读全文