From b3d63b8b73afd841dc0c484a40db590db2003dc5 Mon Sep 17 00:00:00 2001 From: xtaodada Date: Wed, 27 Apr 2022 14:04:19 +0000 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6=E8=87=B3?= =?UTF-8?q?=20''?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ex4_1.c | 193 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 193 insertions(+) create mode 100644 ex4_1.c diff --git a/ex4_1.c b/ex4_1.c new file mode 100644 index 0000000..55b4d9d --- /dev/null +++ b/ex4_1.c @@ -0,0 +1,193 @@ +#include +#include +#include +#include +#define MAX 100 +int top = -1; +typedef struct tnode { + int data; + struct tnode *lchild; + struct tnode *rchild; +}BTNode, *BTree; +typedef struct Queue{ + BTree data; + struct Queue* next; +}Qnode; +typedef struct point{ + Qnode* front;//头指针 + Qnode* rear;//尾指针 +}LinkQueue; +BTree CreatBTree(){ + int num; + BTree p; + scanf("%d", &num); + if (num == -1) { + p = NULL; + } else { + p = (BTree) malloc(sizeof(BTNode)); + p->data = num; + printf("请输入 %d 的左子树:\n", num); + p->lchild = CreatBTree(); + printf("请输入 %d 的右子树:\n", num); + p->rchild = CreatBTree(); + } + return p; +} +void PreOrder(BTree tree){ + if(tree == NULL){ + return; + } + printf("%d", tree->data); + PreOrder(tree->lchild); + PreOrder(tree->rchild); +} +void InOrder(BTree tree){ + if(tree == NULL){ + return; + } + InOrder(tree->lchild); + printf("%d", tree->data); + InOrder(tree->rchild); +} +void LastOrder(BTree tree){ + if(tree == NULL){ + return; + } + LastOrder(tree->lchild); + LastOrder(tree->rchild); + printf("%d", tree->data); +} +void push(BTree a[],BTree node){ + a[++top] = node; +} +void pop(){ + if (top == -1) { + return; + } + top--; +} +BTree getTop(BTree a[]){ + return a[top]; +} +void InOrder2(BTree Tree){ + top = -1; + BTree a[MAX],p; + push(a, Tree); + while (top != -1) { + while ((p = getTop(a)) && p != NULL){ + push(a, p->lchild); + } + pop(); + if (top != -1) { + p = getTop(a); + pop(); + printf("%d", p->data); + push(a, p->rchild); + } + } +} +void InitQueue(LinkQueue* q){ + q->front = q->rear = (Qnode*)malloc(sizeof(Qnode)); + if (q->front == NULL) + return; +} +void EnQueue(LinkQueue* q, BTree ele){ + Qnode* p = (Qnode*)malloc(sizeof(Qnode)); + if (p == NULL) { + return; + } + if (ele == NULL) + return; + p->data = ele; + p->next = NULL; + q->rear->next = p; + q->rear = p; +} +int QueueEmpty(LinkQueue q) +{ + if (q.front != q.rear) + return 1; + else + return 0; +} +BTree DeQueue(LinkQueue* q) +{ + if (q->front == q->rear){ + return; + } + Qnode* p = q->front->next; + BTree q_ = p->data; + q->front->next = p->next; + if (q->rear == p) + q->rear = q->front; + free(p); + return q_; +} +void LevelOrder(BTree Tree){ + top = -1; + BTree p; + LinkQueue Q1; + InitQueue(&Q1); + EnQueue(&Q1, Tree); + while (QueueEmpty(Q1)) { + p = DeQueue(&Q1); + printf("%d ", p->data); + if (p->lchild != NULL) { + EnQueue(&Q1, p->lchild); + } + if (p->rchild != NULL) { + EnQueue(&Q1, p->rchild); + } + } +} +int main(){ + int choice; + BTree tree; + + for(;;){ + printf("\t\t1.递归先序建立二叉树\n"); + printf("\t\t2.先序遍历二叉树\n"); + printf("\t\t3.中序遍历二叉树\n"); + printf("\t\t4.后序遍历二叉树\n"); + printf("\t\t5.中序非递归遍历二叉树\n"); + printf("\t\t6.层次遍历二叉树\n"); + printf("\t\t0.退出\n"); + + printf("请选择:"); + scanf("%d",&choice); + if(choice==0) break; + switch (choice) { + case 1: + printf("开始先序创建二叉树,输入 -1 为空节点\n"); + tree = CreatBTree(); + break; + case 2: + PreOrder(tree); + printf("\n"); + break; + case 3: + InOrder(tree); + printf("\n"); + break; + case 4: + LastOrder(tree); + printf("\n"); + break; + case 5: + InOrder2(tree); + printf("\n"); + break; + case 6: + LevelOrder(tree); + printf("\n"); + break; + default: + break; + } + printf("请按任意键继续..."); + getch(); + system("cls"); + } + printf("感谢使用,再见\n"); + return 0; +}