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 {

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);
    }
}

}

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?