#include
typedef struct TNode {
int data;
struct TNode* left;
struct TNode* right;
} TNode;
typedef struct Node {
struct TNode* mata; // 链结点储存树结点的地址
struct Node* next;
} Node;
typedef struct {
Node* front;
Node* rear;
} ListQ;
typedef struct BiThrNode {
int data;
struct BiThrNode* lchild, * rchild; // 左右指针
int LTag, RTag; // 左右标志
} BiThrNode, *BiThrTree;
typedef struct QNode {
BiThrNode* data;
struct QNode* next;
} QNode, *QueuePtr;
typedef struct {
QueuePtr front;
QueuePtr rear;
} LinkQueue;
int ROX = 0; int Menu(void); void Create(TNode** p); void InitList(ListQ* L); // 初始化队列树根入树 void input(ListQ* L, TNode* Nod); // 入队操作 int IsEmpty(ListQ Q); // 判断队列是否为空 void DeleteNoe(ListQ* Q, TNode** deft); // 队头元素出队 void visit(int korol); // 输出结点信息 void Output(TNode* Nod); // 分层输出结点信息
int Menu(void) {
int sn;
printf(" 二叉树的层次遍历操作\n"); // 显示菜单
printf("==============================\n");
printf(" 1、二叉树的建立\n");
printf(" 2、层次遍历输出\n");
printf(" 3、退出\n");
printf("==============================\n");
printf(" 请选择1--3: ");
for (;;) // 菜单功能选择
{
scanf("%d", &sn);
getchar();
if (sn < 1 || sn > 3)
printf("\n\t 输入选择错误,请重新选择 1--3: ");
else
break;
}
return sn;
}
/TODO:建立二叉树 功能描述:从键盘输入扩展的先序结点数据,输入数据为整形数据,以0表示空结点。 使用递归的方法,建立二叉树,先递归左子树,再递归右子树。 输入结点值scanf(“%d”, // TODO:结点的值); 参数说明: * p-TNode型链表 */ void Create(TNode** p) {
int value;
scanf("%d", &value);
if (value == 0) {
*p = NULL;
}
else {
*p = (TNode*)malloc(sizeof(TNode));
(*p)->data = value;
Create(&(*p)->left);
Create(&(*p)->right);
}
}
// 初始化队列头结点 void InitList(ListQ* L) {
L->front = (Node*) malloc(sizeof(Node));
if (L->front != NULL) {
L->rear = L->front;
(L->front)->next = NULL;
}
else
exit(1);
}
// 把节点入队 void input(ListQ* L, TNode* Nod) {
Node* Newbee;
Newbee = (Node*) malloc(sizeof(Node));
if (Newbee != NULL) {
Newbee->mata = Nod;
Newbee->next = NULL;
L->rear->next = Newbee;
L->rear = Newbee;
}
else
exit(1);
}
// 判断队列是否为空 int IsEmpty(ListQ Q) {
if (Q.front == Q.rear)
return (0);
else
return (1);
}
// 队头元素出队 void DeleteNoe(ListQ* Q, TNode** deft) {
Node* meiko; //定义一个队列指针
meiko = Q->front->next;
Q->front->next = meiko->next;
if (Q->rear == meiko)
Q->rear = Q->front;
*deft = meiko->mata;
free(meiko);
}
// 输出结点信息 void visit(int korol) {
printf("%d\n", korol);
}
/TODO:分层输出结点信息 功能描述:初始化队列,把树中的结点存放到队列中,调用visit(int korol),按层次输出树中的结点信息。 即按分层遍历该二叉树,从上到下按层次访问该二叉树,每一层要求访问的顺序为从左到右输出 参数说明: Nod-TNode型链表 / void Output(TNode Nod) {
ListQ Q;
InitList(&Q);
if (Nod) {
input(&Q, Nod);
while (IsEmpty(Q)) {
DeleteNoe(&Q, &Nod);
visit(Nod->data);
if (Nod->left)
input(&Q, Nod->left);
if (Nod->right)
input(&Q, Nod->right);
}
}
}
int main() {
TNode* Nod = NULL;
for (;;) {
switch (Menu()) {
case 1:
// 建立二叉树
Create(&Nod);
break;
case 2:
// 分层输出结点信息
Output(Nod);
break;
case 3:
return (0);
}
}
}