ZBLOG

#include #include typedef struct TNode { int data; struct TNode * LChild; struct TNode * RChild; } TNode; typedef struct Node { struct TNode * mata; //链结点储存树结点的地址 struct Node *next; } Node; typedef struct { ...

#include #include

typedef struct TNode {

  1. int data;
  2. struct TNode* left;
  3. struct TNode* right;

} TNode;

typedef struct Node {

  1. struct TNode* mata; // 链结点储存树结点的地址
  2. struct Node* next;

} Node;

typedef struct {

  1. Node* front;
  2. Node* rear;

} ListQ;

typedef struct BiThrNode {

  1. int data;
  2. struct BiThrNode* lchild, * rchild; // 左右指针
  3. int LTag, RTag; // 左右标志

} BiThrNode, *BiThrTree;

typedef struct QNode {

  1. BiThrNode* data;
  2. struct QNode* next;

} QNode, *QueuePtr;

typedef struct {

  1. QueuePtr front;
  2. 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) {

  1. int sn;
  2. printf(" 二叉树的层次遍历操作\n"); // 显示菜单
  3. printf("==============================\n");
  4. printf(" 1、二叉树的建立\n");
  5. printf(" 2、层次遍历输出\n");
  6. printf(" 3、退出\n");
  7. printf("==============================\n");
  8. printf(" 请选择1--3: ");
  9. for (;;) // 菜单功能选择
  10. {
  11. scanf("%d", &sn);
  12. getchar();
  13. if (sn < 1 || sn > 3)
  14. printf("\n\t 输入选择错误,请重新选择 1--3: ");
  15. else
  16. break;
  17. }
  18. return sn;

}

/TODO:建立二叉树 功能描述:从键盘输入扩展的先序结点数据,输入数据为整形数据,以0表示空结点。 使用递归的方法,建立二叉树,先递归左子树,再递归右子树。 输入结点值scanf(“%d”, // TODO:结点的值); 参数说明: * p-TNode型链表 */ void Create(TNode** p) {

  1. int value;
  2. scanf("%d", &value);
  3. if (value == 0) {
  4. *p = NULL;
  5. }
  6. else {
  7. *p = (TNode*)malloc(sizeof(TNode));
  8. (*p)->data = value;
  9. Create(&(*p)->left);
  10. Create(&(*p)->right);
  11. }

}

// 初始化队列头结点 void InitList(ListQ* L) {

  1. L->front = (Node*) malloc(sizeof(Node));
  2. if (L->front != NULL) {
  3. L->rear = L->front;
  4. (L->front)->next = NULL;
  5. }
  6. else
  7. exit(1);

}

// 把节点入队 void input(ListQ* L, TNode* Nod) {

  1. Node* Newbee;
  2. Newbee = (Node*) malloc(sizeof(Node));
  3. if (Newbee != NULL) {
  4. Newbee->mata = Nod;
  5. Newbee->next = NULL;
  6. L->rear->next = Newbee;
  7. L->rear = Newbee;
  8. }
  9. else
  10. exit(1);

}

// 判断队列是否为空 int IsEmpty(ListQ Q) {

  1. if (Q.front == Q.rear)
  2. return (0);
  3. else
  4. return (1);

}

// 队头元素出队 void DeleteNoe(ListQ* Q, TNode** deft) {

  1. Node* meiko; //定义一个队列指针
  2. meiko = Q->front->next;
  3. Q->front->next = meiko->next;
  4. if (Q->rear == meiko)
  5. Q->rear = Q->front;
  6. *deft = meiko->mata;
  7. free(meiko);

}

// 输出结点信息 void visit(int korol) {

  1. printf("%d\n", korol);

}

/TODO:分层输出结点信息 功能描述:初始化队列,把树中的结点存放到队列中,调用visit(int korol),按层次输出树中的结点信息。 即按分层遍历该二叉树,从上到下按层次访问该二叉树,每一层要求访问的顺序为从左到右输出 参数说明: Nod-TNode型链表 / void Output(TNode Nod) {

  1. ListQ Q;
  2. InitList(&Q);
  3. if (Nod) {
  4. input(&Q, Nod);
  5. while (IsEmpty(Q)) {
  6. DeleteNoe(&Q, &Nod);
  7. visit(Nod->data);
  8. if (Nod->left)
  9. input(&Q, Nod->left);
  10. if (Nod->right)
  11. input(&Q, Nod->right);
  12. }
  13. }

}

int main() {

  1. TNode* Nod = NULL;
  2. for (;;) {
  3. switch (Menu()) {
  4. case 1:
  5. // 建立二叉树
  6. Create(&Nod);
  7. break;
  8. case 2:
  9. // 分层输出结点信息
  10. Output(Nod);
  11. break;
  12. case 3:
  13. return (0);
  14. }
  15. }

}

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=1150

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?